diff options
author | Paolo Carlini <paolo.carlini@oracle.com> | 2013-07-09 09:28:09 +0000 |
---|---|---|
committer | Paolo Carlini <paolo@gcc.gnu.org> | 2013-07-09 09:28:09 +0000 |
commit | 22adf7b528f4902febeebc2fb2cb078b33068491 (patch) | |
tree | 6a081aa5b0857c7f331dc62a775e0ff7273ee0b3 | |
parent | 3830d98a8ba5f6071683e83f37becdfee359a8eb (diff) | |
download | gcc-22adf7b528f4902febeebc2fb2cb078b33068491.zip gcc-22adf7b528f4902febeebc2fb2cb078b33068491.tar.gz gcc-22adf7b528f4902febeebc2fb2cb078b33068491.tar.bz2 |
re PR c++/51786 ([c++0x] Invalid declaration with decltype accepted)
/cp
2013-07-09 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/51786
* parser.c (cp_parser_simple_declaration): Before calling shadow_tag
also check declares_class_or_enum.
/testsuite
2013-07-09 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/51786
* g++.dg/cpp0x/pr51786.C: New.
From-SVN: r200813
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/parser.c | 13 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/pr51786.C | 8 |
4 files changed, 30 insertions, 2 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 33f6562..696ef35 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2013-07-09 Paolo Carlini <paolo.carlini@oracle.com> + + PR c++/51786 + * parser.c (cp_parser_simple_declaration): Before calling shadow_tag + also check declares_class_or_enum. + 2013-07-08 Jason Merrill <jason@redhat.com> PR c++/57550 diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 05643e4..e2c3c3e 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -11009,11 +11009,20 @@ cp_parser_simple_declaration (cp_parser* parser, /* Issue an error message if no declarators are present, and the decl-specifier-seq does not itself declare a class or - enumeration. */ + enumeration: [dcl.dcl]/3. */ if (!saw_declarator) { if (cp_parser_declares_only_class_p (parser)) - shadow_tag (&decl_specifiers); + { + if (!declares_class_or_enum + && decl_specifiers.type + && OVERLOAD_TYPE_P (decl_specifiers.type)) + /* Ensure an error is issued anyway when finish_decltype_type, + called via cp_parser_decl_specifier_seq, returns a class or + an enumeration (c++/51786). */ + decl_specifiers.type = NULL_TREE; + shadow_tag (&decl_specifiers); + } /* Perform any deferred access checks. */ perform_deferred_access_checks (tf_warning_or_error); } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 6cef4b9..e73706a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2013-07-09 Paolo Carlini <paolo.carlini@oracle.com> + + PR c++/51786 + * g++.dg/cpp0x/pr51786.C: New. + 2013-07-08 Janis Johnson <janisjo@codesourcery.com> * gcc.target/powerpc/tfmode_off.c: Skip for EABI targets. diff --git a/gcc/testsuite/g++.dg/cpp0x/pr51786.C b/gcc/testsuite/g++.dg/cpp0x/pr51786.C new file mode 100644 index 0000000..69b7441 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/pr51786.C @@ -0,0 +1,8 @@ +// PR c++/51786 +// { dg-do compile { target c++11 } } + +enum E {}; +struct A {}; + +void foo() { decltype(E{}); } // { dg-error "does not declare anything" } +void bar() { decltype(A{}); } // { dg-error "does not declare anything" } |