c++: Partially revert: local externs in templates do not get template head
authorNathan Sidwell <nathan@acm.org>
Tue, 15 Sep 2020 14:55:18 +0000 (07:55 -0700)
committerNathan Sidwell <nathan@acm.org>
Tue, 15 Sep 2020 14:57:00 +0000 (07:57 -0700)
Turns out I didn't get OMP reductions correct.  To address those I
need to do some reorganization, so this patch just reverts the
OMP-specific pieces of the local decl changes.

gcc/cp/
* pt.c (push_template_decl_real): OMP reductions retain a template
header.
(tsubst_function_decl): Likewise.

gcc/cp/pt.c

index c630ef5a070bc96666bb23543bcf0266bdae6a63..1aea105edd59bf3e9c6cb26bac81320308ee1da4 100644 (file)
@@ -6072,9 +6072,11 @@ push_template_decl_real (tree decl, bool is_friend)
       if (is_primary)
        retrofit_lang_decl (decl);
       if (DECL_LANG_SPECIFIC (decl)
-         && (!VAR_OR_FUNCTION_DECL_P (decl)
-             || !ctx
-             || !DECL_LOCAL_DECL_P (decl)))
+         && !(VAR_OR_FUNCTION_DECL_P (decl)
+              && DECL_LOCAL_DECL_P (decl)
+              /* OMP reductions still need a template header.  */
+              && !(TREE_CODE (decl) == FUNCTION_DECL
+                   && DECL_OMP_DECLARE_REDUCTION_P (decl))))
        DECL_TEMPLATE_INFO (decl) = info;
     }
 
@@ -13712,7 +13714,8 @@ tsubst_function_decl (tree t, tree args, tsubst_flags_t complain,
   gcc_assert (DECL_TEMPLATE_INFO (t) != NULL_TREE
              || DECL_LOCAL_DECL_P (t));
 
-  if (DECL_LOCAL_DECL_P (t))
+  if (DECL_LOCAL_DECL_P (t)
+      && !DECL_OMP_DECLARE_REDUCTION_P (t))
     {
       if (tree spec = retrieve_local_specialization (t))
        return spec;
@@ -13967,7 +13970,8 @@ tsubst_function_decl (tree t, tree args, tsubst_flags_t complain,
          && !uses_template_parms (argvec))
        tsubst_default_arguments (r, complain);
     }
-  else if (DECL_LOCAL_DECL_P (r))
+  else if (DECL_LOCAL_DECL_P (r)
+          && !DECL_OMP_DECLARE_REDUCTION_P (r))
     {
       if (!cp_unevaluated_operand)
        register_local_specialization (r, t);