Hi,

here we ICE when, at the end of check_tag_decl we pass a DECLTYPE_TYPE to warn_misplaced_attr_for_class_type. I think the right fix is rejecting earlier a decltype with no declarator as a declaration that doesn't declare anything (note: all the compilers I have at hand agree). Tested x86_64-linux.

Thanks, Paolo.

////////////////////

/cp
2018-10-15  Paolo Carlini  <paolo.carl...@oracle.com>

        PR c++/84644
        * decl.c (check_tag_decl): A decltype with no declarator
        doesn't declare anything.

/testsuite
2018-10-15  Paolo Carlini  <paolo.carl...@oracle.com>

        PR c++/84644
        * g++.dg/cpp0x/decltype68.C: New.
        * g++.dg/cpp0x/decltype-33838.C: Adjust.
Index: cp/decl.c
===================================================================
--- cp/decl.c   (revision 265158)
+++ cp/decl.c   (working copy)
@@ -4793,6 +4793,7 @@ check_tag_decl (cp_decl_specifier_seq *declspecs,
   if (declspecs->type
       && TYPE_P (declspecs->type)
       && ((TREE_CODE (declspecs->type) != TYPENAME_TYPE
+          && TREE_CODE (declspecs->type) != DECLTYPE_TYPE
           && MAYBE_CLASS_TYPE_P (declspecs->type))
          || TREE_CODE (declspecs->type) == ENUMERAL_TYPE))
     declared_type = declspecs->type;
Index: testsuite/g++.dg/cpp0x/decltype-33838.C
===================================================================
--- testsuite/g++.dg/cpp0x/decltype-33838.C     (revision 265158)
+++ testsuite/g++.dg/cpp0x/decltype-33838.C     (working copy)
@@ -2,5 +2,5 @@
 // PR c++/33838
 template<typename T> 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<int a>
+struct b {
+  decltype(a) __attribute__((break));  // { dg-error "declaration does not 
declare anything" }
+};

Reply via email to