From a5e2a41f976f6e478a97222d713959cc80c5215e Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Wed, 21 Feb 2018 17:12:08 -0500 Subject: [PATCH] PR c++/84314 - ICE with templates and fastcall attribute. * attribs.c (build_type_attribute_qual_variant): Remove assert. From-SVN: r257883 --- gcc/ChangeLog | 5 +++++ gcc/attribs.c | 19 ++++++++----------- gcc/testsuite/g++.dg/ext/attrib56.C | 6 ++++++ 3 files changed, 19 insertions(+), 11 deletions(-) create mode 100644 gcc/testsuite/g++.dg/ext/attrib56.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 2905e18e599..6b14ff47fae 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2018-02-21 Jason Merrill + + PR c++/84314 - ICE with templates and fastcall attribute. + * attribs.c (build_type_attribute_qual_variant): Remove assert. + 2018-02-21 Jan Hubicka * ipa-cp.c (determine_versionability): Fix comment typos. diff --git a/gcc/attribs.c b/gcc/attribs.c index caa30b99fc6..bfadf124dcb 100644 --- a/gcc/attribs.c +++ b/gcc/attribs.c @@ -1155,17 +1155,14 @@ build_type_attribute_qual_variant (tree otype, tree attribute, int quals) TYPE_CANONICAL. */; else if (TYPE_STRUCTURAL_EQUALITY_P (ttype) || !comp_type_attributes (ntype, ttype)) - { - /* If the target-dependent attributes make NTYPE different from - its canonical type, we will need to use structural equality - checks for this type. - - But make sure we don't get here for stripping attributes from a - type; the no-attribute type might not need structural comparison, - and it should have been in the hash table already. */ - gcc_assert (attribute); - SET_TYPE_STRUCTURAL_EQUALITY (ntype); - } + /* If the target-dependent attributes make NTYPE different from + its canonical type, we will need to use structural equality + checks for this type. + + We shouldn't get here for stripping attributes from a type; + the no-attribute type might not need structural comparison. But + we can if was discarded from type_hash_table. */ + SET_TYPE_STRUCTURAL_EQUALITY (ntype); else if (TYPE_CANONICAL (ntype) == ntype) TYPE_CANONICAL (ntype) = TYPE_CANONICAL (ttype); diff --git a/gcc/testsuite/g++.dg/ext/attrib56.C b/gcc/testsuite/g++.dg/ext/attrib56.C new file mode 100644 index 00000000000..9736d979acd --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/attrib56.C @@ -0,0 +1,6 @@ +// PR c++/84314 +// { dg-do compile { target { { i?86-*-* x86_64-*-* } && ia32 } } } + +struct a { + void b(long() __attribute__((fastcall))) {} +}; -- 2.30.2