]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR c++/68679 (gcc-5.2.1 ICE in C++11 anon union of structs with template fns,...
authorJason Merrill <jason@redhat.com>
Thu, 18 Feb 2016 05:07:55 +0000 (00:07 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Thu, 18 Feb 2016 05:07:55 +0000 (00:07 -0500)
PR c++/68679
* decl2.c (reset_type_linkage_2): Look through member templates.

From-SVN: r233512

gcc/cp/ChangeLog
gcc/cp/decl2.c
gcc/testsuite/g++.dg/other/anon8.C [new file with mode: 0644]

index ca5d838f2443ef83ab06b5e0f2d085fb69d822f3..c560375a5e515e0568baed3b30ff87a5169d75d3 100644 (file)
@@ -1,3 +1,8 @@
+2016-02-17  Jason Merrill  <jason@redhat.com>
+
+       PR c++/68679
+       * decl2.c (reset_type_linkage_2): Look through member templates.
+
 2016-02-17  Jakub Jelinek  <jakub@redhat.com>
 
        PR c++/69850
index 15d7617a4f56d94de155ff08e2a3268f4a5b6645..73b0d280c433793aed3103effcaa64f3947c2e1a 100644 (file)
@@ -2685,14 +2685,22 @@ reset_type_linkage_2 (tree type)
          reset_decl_linkage (ti);
        }
       for (tree m = TYPE_FIELDS (type); m; m = DECL_CHAIN (m))
-       if (VAR_P (m))
-         reset_decl_linkage (m);
+       {
+         tree mem = STRIP_TEMPLATE (m);
+         if (VAR_P (mem))
+           reset_decl_linkage (mem);
+       }
       for (tree m = TYPE_METHODS (type); m; m = DECL_CHAIN (m))
        {
-         reset_decl_linkage (m);
-         if (DECL_MAYBE_IN_CHARGE_CONSTRUCTOR_P (m))
-           /* Also update its name, for cxx_dwarf_name.  */
-           DECL_NAME (m) = TYPE_IDENTIFIER (type);
+         tree mem = STRIP_TEMPLATE (m);
+         reset_decl_linkage (mem);
+         if (DECL_MAYBE_IN_CHARGE_CONSTRUCTOR_P (mem))
+           {
+             /* Also update its name, for cxx_dwarf_name.  */
+             DECL_NAME (mem) = TYPE_IDENTIFIER (type);
+             if (m != mem)
+               DECL_NAME (m) = TYPE_IDENTIFIER (type);
+           }
        }
       binding_table_foreach (CLASSTYPE_NESTED_UTDS (type),
                             bt_reset_linkage_2, NULL);
diff --git a/gcc/testsuite/g++.dg/other/anon8.C b/gcc/testsuite/g++.dg/other/anon8.C
new file mode 100644 (file)
index 0000000..1fdd4c1
--- /dev/null
@@ -0,0 +1,9 @@
+// PR c++/68679
+
+typedef struct {
+  struct {
+    unsigned d[4];
+    template<typename T>
+    unsigned operator[] (T i) const { return d[i]; }
+  } c;
+} A;