c++: Fix ICE on invalid alignas in a template [PR93530]

Message ID 20200201010655.1686545-1-polacek@redhat.com
State New
Headers show
Series
  • c++: Fix ICE on invalid alignas in a template [PR93530]
Related show

Commit Message

Marek Polacek Feb. 1, 2020, 1:06 a.m.
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.

Bootstrapped/regtested on x86_64-linux, ok for trunk?

	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/decl.c                          | 2 +-
 gcc/testsuite/g++.dg/cpp0x/alignas18.C | 8 ++++++++
 2 files changed, 9 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/g++.dg/cpp0x/alignas18.C


base-commit: 2a07345c4f8dabc286fc470e76c53473e5bc3eb7
-- 
Marek Polacek • Red Hat, Inc. • 300 A St, Boston, MA

Comments

Jason Merrill Feb. 2, 2020, 8:10 p.m. | #1
On 1/31/20 8:06 PM, Marek Polacek wrote:
> 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.

> 

> Bootstrapped/regtested on x86_64-linux, ok for trunk?


OK.

> 

> 	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/decl.c                          | 2 +-

>   gcc/testsuite/g++.dg/cpp0x/alignas18.C | 8 ++++++++

>   2 files changed, 9 insertions(+), 1 deletion(-)

>   create mode 100644 gcc/testsuite/g++.dg/cpp0x/alignas18.C

> 

> diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c

> index 6ad558eef9e..576cbd8643a 100644

> --- a/gcc/cp/decl.c

> +++ b/gcc/cp/decl.c

> @@ -12300,7 +12300,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);

> diff --git a/gcc/testsuite/g++.dg/cpp0x/alignas18.C b/gcc/testsuite/g++.dg/cpp0x/alignas18.C

> new file mode 100644

> index 00000000000..820bdd2d7ca

> --- /dev/null

> +++ b/gcc/testsuite/g++.dg/cpp0x/alignas18.C

> @@ -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);

> +};

> 

> base-commit: 2a07345c4f8dabc286fc470e76c53473e5bc3eb7

>

Patch

diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index 6ad558eef9e..576cbd8643a 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -12300,7 +12300,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);
diff --git a/gcc/testsuite/g++.dg/cpp0x/alignas18.C b/gcc/testsuite/g++.dg/cpp0x/alignas18.C
new file mode 100644
index 00000000000..820bdd2d7ca
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/alignas18.C
@@ -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);
+};