aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2016-02-18 00:07:55 -0500
committerJason Merrill <jason@gcc.gnu.org>2016-02-18 00:07:55 -0500
commit50ccdf5bc28a9c14b73fc7b6c6fedb81e0d0f987 (patch)
treea376d2500dcb184211ed0b92ea21b42e28a3c2f2 /gcc
parentf590daa42ae481a9ff2c7c03d298800eae37a561 (diff)
downloadgcc-50ccdf5bc28a9c14b73fc7b6c6fedb81e0d0f987.zip
gcc-50ccdf5bc28a9c14b73fc7b6c6fedb81e0d0f987.tar.gz
gcc-50ccdf5bc28a9c14b73fc7b6c6fedb81e0d0f987.tar.bz2
re PR c++/68679 (gcc-5.2.1 ICE in C++11 anon union of structs with template fns, OK in gcc <= 4.9.3)
PR c++/68679 * decl2.c (reset_type_linkage_2): Look through member templates. From-SVN: r233512
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/decl2.c20
-rw-r--r--gcc/testsuite/g++.dg/other/anon8.C9
3 files changed, 28 insertions, 6 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index ca5d838..c560375 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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
diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c
index 15d7617..73b0d28 100644
--- a/gcc/cp/decl2.c
+++ b/gcc/cp/decl2.c
@@ -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
index 0000000..1fdd4c1
--- /dev/null
+++ b/gcc/testsuite/g++.dg/other/anon8.C
@@ -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;