Index: cp/decl.c =================================================================== --- cp/decl.c (revision 265510) +++ cp/decl.c (working copy) @@ -4798,9 +4798,10 @@ check_tag_decl (cp_decl_specifier_seq *declspecs, declared_type = declspecs->type; else if (declspecs->type == error_mark_node) error_p = true; - if (declared_type == NULL_TREE && ! saw_friend && !error_p) + if ((!declared_type || TREE_CODE (declared_type) == DECLTYPE_TYPE) + && ! saw_friend && !error_p) permerror (input_location, "declaration does not declare anything"); - else if (declared_type != NULL_TREE && type_uses_auto (declared_type)) + else if (declared_type && type_uses_auto (declared_type)) { error_at (declspecs->locations[ds_type_spec], "% can only be specified for variables " @@ -4884,7 +4885,8 @@ check_tag_decl (cp_decl_specifier_seq *declspecs, "% cannot be used for type declarations"); } - if (declspecs->attributes && warn_attributes && declared_type) + if (declspecs->attributes && warn_attributes && declared_type + && TREE_CODE (declared_type) != DECLTYPE_TYPE) { location_t loc; if (!CLASS_TYPE_P (declared_type) Index: testsuite/g++.dg/cpp0x/decltype-33838.C =================================================================== --- testsuite/g++.dg/cpp0x/decltype-33838.C (revision 265510) +++ testsuite/g++.dg/cpp0x/decltype-33838.C (working copy) @@ -2,5 +2,5 @@ // PR c++/33838 template struct A { - __decltype (T* foo()); // { dg-error "expected|no arguments|accept" } + __decltype (T* foo()); // { dg-error "expected|no arguments|declaration" } }; Index: testsuite/g++.dg/cpp0x/decltype68.C =================================================================== --- testsuite/g++.dg/cpp0x/decltype68.C (nonexistent) +++ testsuite/g++.dg/cpp0x/decltype68.C (working copy) @@ -0,0 +1,7 @@ +// PR c++/84644 +// { dg-do compile { target c++11 } } + +template +struct b { + decltype(a) __attribute__((break)); // { dg-error "declaration does not declare anything" } +};