From: Jason Merrill Date: Thu, 18 Feb 2016 05:07:55 +0000 (-0500) Subject: re PR c++/68679 (gcc-5.2.1 ICE in C++11 anon union of structs with template fns,... X-Git-Tag: basepoints/gcc-7~887 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=50ccdf5bc28a9c14b73fc7b6c6fedb81e0d0f987;p=thirdparty%2Fgcc.git 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 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index ca5d838f2443..c560375a5e51 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2016-02-17 Jason Merrill + + PR c++/68679 + * decl2.c (reset_type_linkage_2): Look through member templates. + 2016-02-17 Jakub Jelinek PR c++/69850 diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c index 15d7617a4f56..73b0d280c433 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 000000000000..1fdd4c10d995 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/anon8.C @@ -0,0 +1,9 @@ +// PR c++/68679 + +typedef struct { + struct { + unsigned d[4]; + template + unsigned operator[] (T i) const { return d[i]; } + } c; +} A;