diff options
author | Marek Polacek <polacek@redhat.com> | 2022-02-24 16:41:53 -0500 |
---|---|---|
committer | Marek Polacek <polacek@redhat.com> | 2022-02-28 11:29:25 -0500 |
commit | c8b0571e334792c0c789438617cfb7faf86ab599 (patch) | |
tree | 2595d312e4e2c34215135798b5e1d2e43fc37cf9 | |
parent | 3f3246eb16f554c70c5ce87ad2c785f83adb4625 (diff) | |
download | gcc-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.cc | 3 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/ext/attrib64.C | 11 |
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; |