Commit ad779205 by Richard Henderson Committed by Richard Henderson

re PR middle-end/70273 (FAIL: g++.dg/ext/label13a.C -std=gnu++98 execution test…

re PR middle-end/70273 (FAIL: g++.dg/ext/label13a.C  -std=gnu++98 execution test / scan-assembler _ZN1CC4Ev)

PR c++/70273

  * decl.c (notice_forced_label_r): New.
  (cp_finish_decl): Use it.

From-SVN: r234386
parent 683b8101
2016-03-21 Richard Henderson <rth@redhat.com>
PR c++/70273
* decl.c (notice_forced_label_r): New.
(cp_finish_decl): Use it.
2016-03-21 Jason Merrill <jason@redhat.com> 2016-03-21 Jason Merrill <jason@redhat.com>
PR c++/70285 PR c++/70285
......
...@@ -6499,6 +6499,19 @@ is_concept_var (tree decl) ...@@ -6499,6 +6499,19 @@ is_concept_var (tree decl)
&& DECL_DECLARED_CONCEPT_P (decl)); && DECL_DECLARED_CONCEPT_P (decl));
} }
/* A helper function to be called via walk_tree. If any label exists
under *TP, it is (going to be) forced. Set has_forced_label_in_static. */
static tree
notice_forced_label_r (tree *tp, int *walk_subtrees, void *)
{
if (TYPE_P (*tp))
*walk_subtrees = 0;
if (TREE_CODE (*tp) == LABEL_DECL)
cfun->has_forced_label_in_static = 1;
return NULL_TREE;
}
/* Finish processing of a declaration; /* Finish processing of a declaration;
install its line number and initial value. install its line number and initial value.
If the length of an array type is not known before, If the length of an array type is not known before,
...@@ -6744,13 +6757,17 @@ cp_finish_decl (tree decl, tree init, bool init_const_expr_p, ...@@ -6744,13 +6757,17 @@ cp_finish_decl (tree decl, tree init, bool init_const_expr_p,
&& !DECL_ARTIFICIAL (decl)) && !DECL_ARTIFICIAL (decl))
{ {
push_local_name (decl); push_local_name (decl);
if (DECL_CONSTRUCTOR_P (current_function_decl) /* Normally has_forced_label_in_static is set during GIMPLE
lowering, but [cd]tors are never actually compiled directly.
We need to set this early so we can deal with the label
address extension. */
if ((DECL_CONSTRUCTOR_P (current_function_decl)
|| DECL_DESTRUCTOR_P (current_function_decl)) || DECL_DESTRUCTOR_P (current_function_decl))
/* Normally local_decls is populated during GIMPLE lowering, && init)
but [cd]tors are never actually compiled directly. We need {
to put statics on the list so we can deal with the label walk_tree (&init, notice_forced_label_r, NULL, NULL);
address extension. FIXME. */
add_local_decl (cfun, decl); add_local_decl (cfun, decl);
}
/* And make sure it's in the symbol table for /* And make sure it's in the symbol table for
c_parse_final_cleanups to find. */ c_parse_final_cleanups to find. */
varpool_node::get_create (decl); varpool_node::get_create (decl);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment