Hi rsmith, aaron.ballman,
fillAttributedTypeLoc() function is only called with AttributeLists of either
//DeclarationChunk// (which is used for each type in a declarator being parsed)
or //DeclSpec// (which captures information about declaration specifiers).
As C++11 attributes actually appertain to declarators, they are moved straight
to the declarator’s attr list in distributeFunctionTypeAttrFromDeclSpec()
function.
'Put them wherever you like' semantics is not supported for C++11 attributes
(but is allowed for GNU attributes, for example).
So when we meet an attribute while parsing the declaration, we cannot be sure
if it appertains to either //DeclarationChunk// or //DeclSpec//.
This investigation correlates with the history of changes of SemaType.cpp:
• Asserts in fillAttributedTypeLoc() were added on 3 Mar 2011 in r126986
(http://lists.cs.uiuc.edu/pipermail/cfe-commits/Week-of-Mon-20110228/039638.html);
• Distributing C++11 attrs to the declarator was added on 14 Jan 2013 in
r172504
(http://lists.cs.uiuc.edu/pipermail/cfe-commits/Week-of-Mon-20130114/071830.html).
Considering all written above I changed asserts in fillAttributedTypeLoc() to
nullptr checks.
This fixes PR17424 and related assertion on
```
[[gnu::fastcall]] void __stdcall foo();
```
REPOSITORY
rL LLVM
http://reviews.llvm.org/D9288
Files:
lib/Sema/SemaType.cpp
test/SemaCXX/cxx11-gnu-attrs.cpp
Index: test/SemaCXX/cxx11-gnu-attrs.cpp
===================================================================
--- test/SemaCXX/cxx11-gnu-attrs.cpp
+++ test/SemaCXX/cxx11-gnu-attrs.cpp
@@ -8,6 +8,17 @@
// expected-error@-1 {{'unused' attribute cannot be applied to types}}
int *[[gnu::unused]] attr_on_ptr;
// expected-warning@-1 {{attribute 'unused' ignored, because it cannot be
applied to a type}}
+[[gnu::fastcall]] void pr17424_1();
+// expected-warning@-1 {{calling convention 'fastcall' ignored for this
target}}
+[[gnu::fastcall]] [[gnu::stdcall]] void pr17424_2();
+// expected-warning@-1 {{calling convention 'fastcall' ignored for this
target}}
+// expected-warning@-2 {{calling convention 'stdcall' ignored for this target}}
+[[gnu::fastcall]] __stdcall void pr17424_3();
+// expected-warning@-1 {{calling convention 'fastcall' ignored for this
target}}
+// expected-warning@-2 {{calling convention '__stdcall' ignored for this
target}}
+[[gnu::fastcall]] void pr17424_4() [[gnu::stdcall]];
+// expected-warning@-1 {{calling convention 'fastcall' ignored for this
target}}
+// expected-warning@-2 {{attribute 'stdcall' ignored, because it cannot be
applied to a type}}
// Valid cases.
Index: lib/Sema/SemaType.cpp
===================================================================
--- lib/Sema/SemaType.cpp
+++ lib/Sema/SemaType.cpp
@@ -3492,13 +3492,15 @@
static void fillAttributedTypeLoc(AttributedTypeLoc TL,
const AttributeList *attrs) {
- AttributedType::Kind kind = TL.getAttrKind();
+ if (!attrs)
+ return;
- assert(attrs && "no type attributes in the expected location!");
+ AttributedType::Kind kind = TL.getAttrKind();
AttributeList::Kind parsedKind = getAttrListKind(kind);
while (attrs->getKind() != parsedKind) {
attrs = attrs->getNext();
- assert(attrs && "no matching attribute in expected location!");
+ if (!attrs)
+ return;
}
TL.setAttrNameLoc(attrs->getLoc());
EMAIL PREFERENCES
http://reviews.llvm.org/settings/panel/emailpreferences/
Index: test/SemaCXX/cxx11-gnu-attrs.cpp
===================================================================
--- test/SemaCXX/cxx11-gnu-attrs.cpp
+++ test/SemaCXX/cxx11-gnu-attrs.cpp
@@ -8,6 +8,17 @@
// expected-error@-1 {{'unused' attribute cannot be applied to types}}
int *[[gnu::unused]] attr_on_ptr;
// expected-warning@-1 {{attribute 'unused' ignored, because it cannot be applied to a type}}
+[[gnu::fastcall]] void pr17424_1();
+// expected-warning@-1 {{calling convention 'fastcall' ignored for this target}}
+[[gnu::fastcall]] [[gnu::stdcall]] void pr17424_2();
+// expected-warning@-1 {{calling convention 'fastcall' ignored for this target}}
+// expected-warning@-2 {{calling convention 'stdcall' ignored for this target}}
+[[gnu::fastcall]] __stdcall void pr17424_3();
+// expected-warning@-1 {{calling convention 'fastcall' ignored for this target}}
+// expected-warning@-2 {{calling convention '__stdcall' ignored for this target}}
+[[gnu::fastcall]] void pr17424_4() [[gnu::stdcall]];
+// expected-warning@-1 {{calling convention 'fastcall' ignored for this target}}
+// expected-warning@-2 {{attribute 'stdcall' ignored, because it cannot be applied to a type}}
// Valid cases.
Index: lib/Sema/SemaType.cpp
===================================================================
--- lib/Sema/SemaType.cpp
+++ lib/Sema/SemaType.cpp
@@ -3492,13 +3492,15 @@
static void fillAttributedTypeLoc(AttributedTypeLoc TL,
const AttributeList *attrs) {
- AttributedType::Kind kind = TL.getAttrKind();
+ if (!attrs)
+ return;
- assert(attrs && "no type attributes in the expected location!");
+ AttributedType::Kind kind = TL.getAttrKind();
AttributeList::Kind parsedKind = getAttrListKind(kind);
while (attrs->getKind() != parsedKind) {
attrs = attrs->getNext();
- assert(attrs && "no matching attribute in expected location!");
+ if (!attrs)
+ return;
}
TL.setAttrNameLoc(attrs->getLoc());
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits