Index: cp/parser.c =================================================================== --- cp/parser.c (revision 200742) +++ cp/parser.c (working copy) @@ -11009,11 +11009,19 @@ 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 != error_mark_node) + /* Ensure an error is issued anyway when finish_decltype_type, + called via cp_parser_decl_specifier_seq, returns something + sensible (c++/51786). */ + decl_specifiers.type = NULL_TREE; + shadow_tag (&decl_specifiers); + } /* Perform any deferred access checks. */ perform_deferred_access_checks (tf_warning_or_error); } Index: testsuite/g++.dg/cpp0x/auto30.C =================================================================== --- testsuite/g++.dg/cpp0x/auto30.C (revision 200742) +++ testsuite/g++.dg/cpp0x/auto30.C (working copy) @@ -6,4 +6,4 @@ struct A auto friend struct B; // { dg-error "multiple types|can only be specified|friend" } }; -auto int; // { dg-error "multiple types|can only be specified for variables" } +auto int; // { dg-error "multiple types|does not declare anything" } Index: testsuite/g++.dg/cpp0x/pr51786.C =================================================================== --- testsuite/g++.dg/cpp0x/pr51786.C (revision 0) +++ testsuite/g++.dg/cpp0x/pr51786.C (working copy) @@ -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" }