diff options
author | Jason Merrill <jason@redhat.com> | 2016-02-18 00:07:55 -0500 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2016-02-18 00:07:55 -0500 |
commit | 50ccdf5bc28a9c14b73fc7b6c6fedb81e0d0f987 (patch) | |
tree | a376d2500dcb184211ed0b92ea21b42e28a3c2f2 /gcc | |
parent | f590daa42ae481a9ff2c7c03d298800eae37a561 (diff) | |
download | gcc-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/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/cp/decl2.c | 20 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/other/anon8.C | 9 |
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; |