diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/cp/decl2.c | 54 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/warn/deprecated-11.C | 7 |
3 files changed, 46 insertions, 19 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 8cf538b22a5..603758cbd90 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,9 @@ 2016-07-21 Jason Merrill <jason@redhat.com> + PR c++/71274 + * decl2.c (maybe_instantiate_decl): Split out from mark_used. + (decl_constant_var_p): Use it instead. + PR c++/71630 * pt.c (instantiate_decl): Fix pattern_defined for namespace scope variable templates. diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c index 22f9eded291..2ff6f53ba4f 100644 --- a/gcc/cp/decl2.c +++ b/gcc/cp/decl2.c @@ -81,6 +81,7 @@ static tree get_guard_bits (tree); static void determine_visibility_from_class (tree, tree); static bool determine_hidden_inline (tree); static bool decl_defined_p (tree); +static void maybe_instantiate_decl (tree); /* A list of static class variables. This is needed, because a static class variable can be declared inside the class without @@ -4217,7 +4218,7 @@ decl_constant_var_p (tree decl) in the case of a constexpr variable, we can't treat it as a constant until its initializer is complete in case it's used in its own initializer. */ - mark_used (decl); + maybe_instantiate_decl (decl); return DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (decl); } @@ -5057,6 +5058,38 @@ possibly_inlined_p (tree decl) return true; } +/* Normally, we can wait until instantiation-time to synthesize DECL. + However, if DECL is a static data member initialized with a constant + or a constexpr function, we need it right now because a reference to + such a data member or a call to such function is not value-dependent. + For a function that uses auto in the return type, we need to instantiate + it to find out its type. For OpenMP user defined reductions, we need + them instantiated for reduction clauses which inline them by hand + directly. */ + +static void +maybe_instantiate_decl (tree decl) +{ + if (DECL_LANG_SPECIFIC (decl) + && DECL_TEMPLATE_INFO (decl) + && (decl_maybe_constant_var_p (decl) + || (TREE_CODE (decl) == FUNCTION_DECL + && DECL_OMP_DECLARE_REDUCTION_P (decl)) + || undeduced_auto_decl (decl)) + && !DECL_DECLARED_CONCEPT_P (decl) + && !uses_template_parms (DECL_TI_ARGS (decl))) + { + /* Instantiating a function will result in garbage collection. We + must treat this situation as if we were within the body of a + function so as to avoid collecting live data only referenced from + the stack (such as overload resolution candidates). */ + ++function_depth; + instantiate_decl (decl, /*defer_ok=*/false, + /*expl_inst_class_mem_p=*/false); + --function_depth; + } +} + /* Mark DECL (either a _DECL or a BASELINK) as "used" in the program. If DECL is a specialization or implicitly declared class member, generate the actual definition. Return false if something goes @@ -5151,24 +5184,7 @@ mark_used (tree decl, tsubst_flags_t complain) it to find out its type. For OpenMP user defined reductions, we need them instantiated for reduction clauses which inline them by hand directly. */ - if (DECL_LANG_SPECIFIC (decl) - && DECL_TEMPLATE_INFO (decl) - && (decl_maybe_constant_var_p (decl) - || (TREE_CODE (decl) == FUNCTION_DECL - && DECL_OMP_DECLARE_REDUCTION_P (decl)) - || undeduced_auto_decl (decl)) - && !DECL_DECLARED_CONCEPT_P (decl) - && !uses_template_parms (DECL_TI_ARGS (decl))) - { - /* Instantiating a function will result in garbage collection. We - must treat this situation as if we were within the body of a - function so as to avoid collecting live data only referenced from - the stack (such as overload resolution candidates). */ - ++function_depth; - instantiate_decl (decl, /*defer_ok=*/false, - /*expl_inst_class_mem_p=*/false); - --function_depth; - } + maybe_instantiate_decl (decl); if (processing_template_decl || in_template_function ()) return true; diff --git a/gcc/testsuite/g++.dg/warn/deprecated-11.C b/gcc/testsuite/g++.dg/warn/deprecated-11.C new file mode 100644 index 00000000000..56522905afa --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/deprecated-11.C @@ -0,0 +1,7 @@ +// PR c++/71274 +// { dg-options -Wdeprecated-declarations } + +struct foo +{ + __attribute__ ((deprecated)) static const int a; +}; |