summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--clang/lib/Sema/SemaDeclAttr.cpp11
-rw-r--r--clang/lib/Sema/SemaType.cpp12
-rw-r--r--clang/test/Sema/callingconv.c3
3 files changed, 13 insertions, 13 deletions
diff --git a/clang/lib/Sema/SemaDeclAttr.cpp b/clang/lib/Sema/SemaDeclAttr.cpp
index 8530c8bd158..ceb4a3649be 100644
--- a/clang/lib/Sema/SemaDeclAttr.cpp
+++ b/clang/lib/Sema/SemaDeclAttr.cpp
@@ -3869,18 +3869,11 @@ bool Sema::CheckCallingConvAttr(const AttributeList &attr, CallingConv &CC,
CC_C;
break;
case AttributeList::AT_Pcs: {
- StringLiteral *Str = 0;
- if (attr.isArgExpr(0))
- Str = dyn_cast<StringLiteral>(attr.getArgAsExpr(0));
-
- if (!Str || !Str->isAscii()) {
- Diag(attr.getLoc(), diag::err_attribute_argument_type) << attr.getName()
- << AANT_ArgumentString;
+ StringRef StrRef;
+ if (!checkStringLiteralArgument(*this, StrRef, attr, 0)) {
attr.setInvalid();
return true;
}
-
- StringRef StrRef = Str->getString();
if (StrRef == "aapcs") {
CC = CC_AAPCS;
break;
diff --git a/clang/lib/Sema/SemaType.cpp b/clang/lib/Sema/SemaType.cpp
index 7abc36afb49..d0da7b752a1 100644
--- a/clang/lib/Sema/SemaType.cpp
+++ b/clang/lib/Sema/SemaType.cpp
@@ -4371,9 +4371,15 @@ static AttributedType::Kind getCCTypeAttrKind(AttributeList &Attr) {
case AttributeList::AT_Pascal:
return AttributedType::attr_pascal;
case AttributeList::AT_Pcs: {
- // We know attr is valid so it can only have one of two strings args.
- StringLiteral *Str = cast<StringLiteral>(Attr.getArgAsExpr(0));
- return llvm::StringSwitch<AttributedType::Kind>(Str->getString())
+ // The attribute may have had a fixit applied where we treated an
+ // identifier as a string literal. The contents of the string are valid,
+ // but the form may not be.
+ StringRef Str;
+ if (Attr.isArgExpr(0))
+ Str = cast<StringLiteral>(Attr.getArgAsExpr(0))->getString();
+ else
+ Str = Attr.getArgAsIdent(0)->Ident->getName();
+ return llvm::StringSwitch<AttributedType::Kind>(Str)
.Case("aapcs", AttributedType::attr_pcs)
.Case("aapcs-vfp", AttributedType::attr_pcs_vfp);
}
diff --git a/clang/test/Sema/callingconv.c b/clang/test/Sema/callingconv.c
index 3234609d686..5badc14a01f 100644
--- a/clang/test/Sema/callingconv.c
+++ b/clang/test/Sema/callingconv.c
@@ -38,7 +38,8 @@ Handler H = foo;
int __attribute__((pcs("aapcs", "aapcs"))) pcs1(void); // expected-error {{'pcs' attribute takes one argument}}
int __attribute__((pcs())) pcs2(void); // expected-error {{'pcs' attribute takes one argument}}
-int __attribute__((pcs(pcs1))) pcs3(void); // expected-error {{'pcs' attribute requires a string}}
+int __attribute__((pcs(pcs1))) pcs3(void); // expected-error {{'pcs' attribute requires a string}} \
+ // expected-error {{invalid PCS type}}
int __attribute__((pcs(0))) pcs4(void); // expected-error {{'pcs' attribute requires a string}}
/* These are ignored because the target is i386 and not ARM */
int __attribute__((pcs("aapcs"))) pcs5(void); // expected-warning {{calling convention 'pcs' ignored for this target}}
OpenPOWER on IntegriCloud