aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarek Polacek <polacek@redhat.com>2022-02-24 16:41:53 -0500
committerMarek Polacek <polacek@redhat.com>2022-02-28 11:29:25 -0500
commitc8b0571e334792c0c789438617cfb7faf86ab599 (patch)
tree2595d312e4e2c34215135798b5e1d2e43fc37cf9
parent3f3246eb16f554c70c5ce87ad2c785f83adb4625 (diff)
downloadgcc-c8b0571e334792c0c789438617cfb7faf86ab599.zip
gcc-c8b0571e334792c0c789438617cfb7faf86ab599.tar.gz
gcc-c8b0571e334792c0c789438617cfb7faf86ab599.tar.bz2
c++: ICE with attribute on enumerator [PR104667]
When processing a template, the enumerators we build don't have a type yet. But is_late_template_attribute is not prepared to see a _DECL without a type, so we crash on enum tree_code code = TREE_CODE (type); (I found that we don't give the "is deprecated" warning for the enumerator 'f' in the test. Reported as PR104682.) PR c++/104667 gcc/cp/ChangeLog: * decl2.cc (is_late_template_attribute): Cope with a decl without a type. gcc/testsuite/ChangeLog: * g++.dg/ext/attrib64.C: New test.
-rw-r--r--gcc/cp/decl2.cc3
-rw-r--r--gcc/testsuite/g++.dg/ext/attrib64.C11
2 files changed, 14 insertions, 0 deletions
diff --git a/gcc/cp/decl2.cc b/gcc/cp/decl2.cc
index 2e58419..22edc2b 100644
--- a/gcc/cp/decl2.cc
+++ b/gcc/cp/decl2.cc
@@ -1298,6 +1298,9 @@ is_late_template_attribute (tree attr, tree decl)
{
tree type = TYPE_P (decl) ? decl : TREE_TYPE (decl);
+ if (!type)
+ return true;
+
/* We can't apply any attributes to a completely unknown type until
instantiation time. */
enum tree_code code = TREE_CODE (type);
diff --git a/gcc/testsuite/g++.dg/ext/attrib64.C b/gcc/testsuite/g++.dg/ext/attrib64.C
new file mode 100644
index 0000000..4a4505f
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ext/attrib64.C
@@ -0,0 +1,11 @@
+// PR c++/104667
+// { dg-do compile }
+
+template<typename> struct A {
+ enum E { // { dg-warning "only applies to function types" }
+ e __attribute__ ((access(read_only))),
+ f __attribute__ ((deprecated))
+ };
+};
+
+A<int> a;