c++: Fix ICE on invalid alignas in a template [PR93530]
authorMarek Polacek <polacek@redhat.com>
Sat, 1 Feb 2020 00:28:10 +0000 (19:28 -0500)
committerMarek Polacek <polacek@redhat.com>
Sun, 2 Feb 2020 20:30:21 +0000 (15:30 -0500)
This fixes an ICE taking place in cp_default_conversion because we got
a SCOPE_REF that doesn't have a type and so checking
INTEGRAL_OR_UNSCOPED_ENUMERATION_TYPE_P (TREE_TYPE (exp)) will crash.
This happens since the recent Joseph's change in decl_attributes whereby
we don't skip C++11 attributes on types.

[dcl.align] is clear that alignas applied to a function is ill-formed.
That should be fixed, and we have PR90847 for that.  But I think a more
appropriate fix at this stage would be the following: in a template we
want to splice dependent attributes and save them for later, and by
doing so avoid this crash.

PR c++/93530 - ICE on invalid alignas in a template.
* decl.c (grokdeclarator): Call cplus_decl_attributes instead of
decl_attributes.

* g++.dg/cpp0x/alignas18.C: New test.

gcc/cp/ChangeLog
gcc/cp/decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp0x/alignas18.C [new file with mode: 0644]

index 999348d..ed1c64f 100644 (file)
@@ -1,3 +1,9 @@
+2020-02-02  Marek Polacek  <polacek@redhat.com>
+
+       PR c++/93530 - ICE on invalid alignas in a template.
+       * decl.c (grokdeclarator): Call cplus_decl_attributes instead of
+       decl_attributes.
+
 2020-01-31  Jason Merrill  <jason@redhat.com>
 
        PR c++/86216
index ef34f43..859fd1b 100644 (file)
@@ -12318,7 +12318,7 @@ grokdeclarator (const cp_declarator *declarator,
 
                 The optional attribute-specifier-seq appertains to
                 the function type.  */
-             decl_attributes (&type, attrs, 0);
+             cplus_decl_attributes (&type, attrs, 0);
 
            if (raises)
              type = build_exception_variant (type, raises);
index 0562040..74cbead 100644 (file)
@@ -1,3 +1,8 @@
+2020-02-02  Marek Polacek  <polacek@redhat.com>
+
+       PR c++/93530 - ICE on invalid alignas in a template.
+       * g++.dg/cpp0x/alignas18.C: New test.
+
 2020-02-02  Iain Sandoe  <iain@sandoe.co.uk>
 
        * gcc.target/powerpc/darwin-abi-12.c: Add '-fcommon' to the
diff --git a/gcc/testsuite/g++.dg/cpp0x/alignas18.C b/gcc/testsuite/g++.dg/cpp0x/alignas18.C
new file mode 100644 (file)
index 0000000..820bdd2
--- /dev/null
@@ -0,0 +1,8 @@
+// PR c++/93530 - ICE on invalid alignas in a template.
+// { dg-do compile { target c++11 } }
+
+template <typename T> struct S {
+  using U = S;
+  // FIXME: This is ill-formed; see PR90847.
+  void fn() alignas(U::X);
+};