aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaolo Carlini <paolo.carlini@oracle.com>2017-03-21 10:18:51 +0000
committerPaolo Carlini <paolo.carlini@oracle.com>2017-03-21 10:18:51 +0000
commitf15949ef83ef97c3aab22ee56488b07d1c987968 (patch)
treedb3f380de30ffdfd1aa7daf16a7f82be7750a17a
parented16871bacf0ebb27ff1f7ce099596a401dac953 (diff)
/cp
2017-03-21 Paolo Carlini <paolo.carlini@oracle.com> PR c++/77752 * name-lookup.c (pushtag_1): Add check for bogus, non template, std::initializer_list. /testsuite 2017-03-21 Paolo Carlini <paolo.carlini@oracle.com> PR c++/77752 * g++.dg/cpp0x/initlist97.C: New. * g++.dg/cpp0x/initlist85.C: Update. git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@246310 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/name-lookup.c9
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/initlist85.C6
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/initlist97.C7
5 files changed, 30 insertions, 4 deletions
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 <paolo.carlini@oracle.com>
+
+ PR c++/77752
+ * name-lookup.c (pushtag_1): Add check for bogus, non template,
+ std::initializer_list.
+
2017-03-21 Jakub Jelinek <jakub@redhat.com>
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 <initializer_list>, 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 <paolo.carlini@oracle.com>
+
+ PR c++/77752
+ * g++.dg/cpp0x/initlist97.C: New.
+ * g++.dg/cpp0x/initlist85.C: Update.
+
2017-03-21 Jakub Jelinek <jakub@redhat.com>
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" }