On 18/11/15 22:55, Jakub Jelinek wrote:
static bool
-identify_goto (tree decl, const location_t *locus)
+identify_goto (tree decl, const location_t *locus, bool harderr)
{
- bool complained = (decl
- ? permerror (input_location, "jump to label %qD", decl)
- : permerror (input_location, "jump to case label"));
+ bool complained;
+ if (!harderr)
+ {
+ if (decl)
+ complained = permerror (input_location, "jump to label %qD", decl);
+ else
+ complained = permerror (input_location, "jump to case label");
+ }
+ else
+ {
+ if (decl)
+ error ("jump to label %qD", decl);
+ else
+ error ("jump to case label");
+ complained = true;
+ }
if (complained && locus)
inform (*locus, " from here");
return complained;
The above is a bit repetitive. Why not simply?
static bool
error_jumpto (diagnostic_t kind, location_t loc, tree decl)
{
bool complained = (decl
? emit_diagnostic (kind, input_location, 0,
"jump to label %qD", decl)
: emit_diagnostic (kind, input_location, 0,
"jump to case label"));
if (complained && loc)
inform (loc, " from here");
return complained;
}
That is, call a function that gives errors about X, error_X; no point in
passing a pointer to location_t; most diagnostic functions take loc as the
first argument; no obscure bool parameter. Then call:
@@ -2991,15 +3004,16 @@ check_previous_goto_1 (tree decl, cp_bin
bool exited_omp, const location_t *locus)
{
cp_binding_level *b;
- bool identified = false, complained = false;
+ bool complained = false;
+ int identified = 0;
bool saw_eh = false, saw_omp = false, saw_tm = false;
if (exited_omp)
{
- complained = identify_goto (decl, locus);
+ complained = identify_goto (decl, locus, true);
complained = error_jumpto (DK_ERROR, loc, decl);
+ complained = identify_goto (decl, locus, false);
complained = error_jumpto (DK_PERMERROR, loc, decl);
+ if (ent->in_try_scope || ent->in_catch_scope
+ || ent->in_transaction_scope || ent->in_omp_scope)
+ {
+ error_at (DECL_SOURCE_LOCATION (decl), "jump to label %qD", decl);
+ complained = true;
+ identified = 2;
+ }
+ else
+ {
+ complained = permerror (DECL_SOURCE_LOCATION (decl),
+ "jump to label %qD", decl);
+ identified = 1;
+ }
if (complained)
inform (input_location, " from here");
Note that if the function above takes another location_t argument, you can also
simplify this hunk to:
diagnostic_t kind;
if (ent->in_try_scope || ent->in_catch_scope
|| ent->in_transaction_scope || ent->in_omp_scope)
{
kind = DK_ERROR;
identified = 2;
}
else
{
kind = DK_PERMERROR;
identified = 1;
}
complained = error_jumpto (kind, loc, DECL_SOURCE_LOCATION (decl),
decl);
You can even use kind (maybe 'error_kind') directly instead of identified for
what you are trying to achieve, with error_kind in {DK_UNSPECIFIED, DK_ERROR,
DK_PERMERROR}.
FOR_EACH_VEC_SAFE_ELT (ent->bad_decls, ix, bad)
@@ -3155,6 +3180,14 @@ check_goto (tree decl)
if (u > 1 && DECL_ARTIFICIAL (bad))
{
/* Can't skip init of __exception_info. */
+ if (identified == 1)
+ {
+ error_at (DECL_SOURCE_LOCATION (decl),
+ "jump to label %qD", decl);
+ inform (input_location, " from here");
+ complained = true;
+ identified = 2;
+ }
and here:
kind = DK_ERROR;
complained = error_jumpto (kind, input_location,
DECL_SOURCE_LOCATION (decl), decl);
if (complained)
inform (DECL_SOURCE_LOCATION (bad), " enters catch block");
saw_catch = true;
@@ -3195,13 +3228,13 @@ check_goto (tree decl)
break;
if (b->kind == sk_omp)
{
- if (!identified)
+ if (identified < 2)
{
- complained = permerror (DECL_SOURCE_LOCATION (decl),
- "jump to label %qD", decl);
- if (complained)
- inform (input_location, " from here");
- identified = true;
+ error_at (DECL_SOURCE_LOCATION (decl),
+ "jump to label %qD", decl);
+ inform (input_location, " from here");
+ complained = true;
+ identified = 2;
}
and the same here.
Cheers,
Manuel.