From: Paolo Carlini Date: Tue, 21 Mar 2017 10:18:51 +0000 (+0000) Subject: re PR c++/77752 (ICE on C++ code on x86_64-linux-gnu (internal compiler error: Segmen... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=d3e19c2c97facd63a5ae71a164b89a913beecf18;p=gcc.git re PR c++/77752 (ICE on C++ code on x86_64-linux-gnu (internal compiler error: Segmentation fault, build_list_conv, implicit_conversion)) /cp 2017-03-21 Paolo Carlini PR c++/77752 * name-lookup.c (pushtag_1): Add check for bogus, non template, std::initializer_list. /testsuite 2017-03-21 Paolo Carlini PR c++/77752 * g++.dg/cpp0x/initlist97.C: New. * g++.dg/cpp0x/initlist85.C: Update. From-SVN: r246310 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 20eaf630224..3db9895d5a8 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2017-03-21 Paolo Carlini + + PR c++/77752 + * name-lookup.c (pushtag_1): Add check for bogus, non template, + std::initializer_list. + 2017-03-21 Jakub Jelinek PR c++/35878 diff --git a/gcc/cp/name-lookup.c b/gcc/cp/name-lookup.c index 994f7f0c5c3..4d7d3a1bad4 100644 --- a/gcc/cp/name-lookup.c +++ b/gcc/cp/name-lookup.c @@ -6207,6 +6207,15 @@ pushtag_1 (tree name, tree type, tag_scope scope) decl = pushdecl_with_scope_1 (decl, b, /*is_friend=*/false); if (decl == error_mark_node) return decl; + + if (DECL_CONTEXT (decl) == std_node + && strcmp (TYPE_NAME_STRING (type), "initializer_list") == 0 + && !CLASSTYPE_TEMPLATE_INFO (type)) + { + error ("declaration of std::initializer_list does not match " + "#include , isn't a template"); + return error_mark_node; + } } if (! in_class) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 69cf11200da..a4d58737308 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2017-03-21 Paolo Carlini + + PR c++/77752 + * g++.dg/cpp0x/initlist97.C: New. + * g++.dg/cpp0x/initlist85.C: Update. + 2017-03-21 Jakub Jelinek PR c/67338 diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist85.C b/gcc/testsuite/g++.dg/cpp0x/initlist85.C index fa4fb617b33..0b5ce497e49 100644 --- a/gcc/testsuite/g++.dg/cpp0x/initlist85.C +++ b/gcc/testsuite/g++.dg/cpp0x/initlist85.C @@ -3,14 +3,12 @@ namespace std { - struct initializer_list {}; // { dg-message "initializer_list" } + struct initializer_list {}; // { dg-error "declaration" } } void foo(std::initializer_list &); void f() { - foo({1, 2}); + foo({1, 2}); // { dg-error "invalid initialization" } } - -// { dg-prune-output "compilation terminated" } diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist97.C b/gcc/testsuite/g++.dg/cpp0x/initlist97.C new file mode 100644 index 00000000000..be474155a3a --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist97.C @@ -0,0 +1,7 @@ +// PR c++/77752 +// { dg-do compile { target c++11 } } + +namespace std { + class initializer_list; // { dg-error "declaration" } +} +void f(std::initializer_list l) { f({2}); } // { dg-error "incomplete type" }