PR c++/60992
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 3 Jun 2014 15:39:20 +0000 (15:39 +0000)
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 3 Jun 2014 15:39:20 +0000 (15:39 +0000)
* pt.c (tsubst_copy) [VAR_DECL]: Try lookup first.  Add a new
variable to local_specializations.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@211188 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/pt.c

index 2ed9f15..f356caa 100644 (file)
@@ -1,5 +1,9 @@
 2014-06-03  Jason Merrill  <jason@redhat.com>
 
+       PR c++/60992
+       * pt.c (tsubst_copy) [VAR_DECL]: Try lookup first.  Add a new
+       variable to local_specializations.
+
        PR c++/60848
        * call.c (is_std_init_list): Check CLASSTYPE_TEMPLATE_INFO.
 
index d267a5c..8858908 100644 (file)
@@ -12730,14 +12730,19 @@ tsubst_copy (tree t, tree args, tsubst_flags_t complain, tree in_decl)
          r = retrieve_local_specialization (t);
          if (r == NULL_TREE)
            {
-             if (DECL_ANON_UNION_VAR_P (t))
+             /* First try name lookup to find the instantiation.  */
+             r = lookup_name (DECL_NAME (t));
+             if (r)
                {
-                 /* Just use name lookup to find a member alias for an
-                    anonymous union, but then add it to the hash table.  */
-                 r = lookup_name (DECL_NAME (t));
-                 gcc_assert (DECL_ANON_UNION_VAR_P (r));
-                 register_local_specialization (r, t);
+                 /* Make sure that the one we found is the one we want.  */
+                 tree ctx = tsubst (DECL_CONTEXT (t), args,
+                                    complain, in_decl);
+                 if (ctx != DECL_CONTEXT (r))
+                   r = NULL_TREE;
                }
+
+             if (r)
+               /* OK */;
              else
                {
                  /* This can happen for a variable used in a
@@ -12771,10 +12776,12 @@ tsubst_copy (tree t, tree args, tsubst_flags_t complain, tree in_decl)
                      else if (decl_constant_var_p (r))
                        /* A use of a local constant decays to its value.
                           FIXME update for core DR 696.  */
-                       return integral_constant_value (r);
+                       r = integral_constant_value (r);
                    }
-                 return r;
                }
+             /* Remember this for subsequent uses.  */
+             if (local_specializations)
+               register_local_specialization (r, t);
            }
        }
       else