summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
authorSaleem Abdulrasool <compnerd@compnerd.org>2014-10-15 21:37:55 +0000
committerSaleem Abdulrasool <compnerd@compnerd.org>2014-10-15 21:37:55 +0000
commitbbdd6c13dea74ce60a162780e20f052f5cab247c (patch)
treedd542c13cb0080622fd7a7f62111ffa3fe67bcfe /clang
parent4c879bed5b1b79d98cfc3b45c4ee4d4a32ba8a32 (diff)
downloadbcm5719-llvm-bbdd6c13dea74ce60a162780e20f052f5cab247c.tar.gz
bcm5719-llvm-bbdd6c13dea74ce60a162780e20f052f5cab247c.zip
Sema: handle AttributedTypeLocs in C++14 auto deduction
When performing a type deduction from the return type, the FunctionDecl may be attributed with a calling convention. In such a case, the retrieved type location may be an AttributedTypeLoc. Performing a castAs<FunctionProtoTypeLoc> on such a type loc would result in an assertion as they are not derived types. Ensure that we correctly handle the attributed type location by looking through it to the modified type loc. Fixes an assertion triggered in C++14 mode. llvm-svn: 219851
Diffstat (limited to 'clang')
-rw-r--r--clang/lib/Sema/SemaStmt.cpp7
-rw-r--r--clang/test/Sema/attributed-auto-deduction.cpp10
2 files changed, 15 insertions, 2 deletions
diff --git a/clang/lib/Sema/SemaStmt.cpp b/clang/lib/Sema/SemaStmt.cpp
index 464206eafe3..c03ac86de05 100644
--- a/clang/lib/Sema/SemaStmt.cpp
+++ b/clang/lib/Sema/SemaStmt.cpp
@@ -2755,8 +2755,11 @@ bool Sema::DeduceFunctionTypeFromReturnExpr(FunctionDecl *FD,
SourceLocation ReturnLoc,
Expr *&RetExpr,
AutoType *AT) {
- TypeLoc OrigResultType = FD->getTypeSourceInfo()->getTypeLoc().
- IgnoreParens().castAs<FunctionProtoTypeLoc>().getReturnLoc();
+ TypeLoc TL = FD->getTypeSourceInfo()->getTypeLoc();
+ if (auto ATL = TL.getAs<AttributedTypeLoc>())
+ TL = ATL.getModifiedLoc();
+ TypeLoc OrigResultType =
+ TL.IgnoreParens().castAs<FunctionProtoTypeLoc>().getReturnLoc();
QualType Deduced;
if (RetExpr && isa<InitListExpr>(RetExpr)) {
diff --git a/clang/test/Sema/attributed-auto-deduction.cpp b/clang/test/Sema/attributed-auto-deduction.cpp
new file mode 100644
index 00000000000..d8dc43d6691
--- /dev/null
+++ b/clang/test/Sema/attributed-auto-deduction.cpp
@@ -0,0 +1,10 @@
+// RUN: %clang_cc1 -triple armv7 -std=c++14 -x c++ %s -fsyntax-only
+// expected-no-diagnostics
+
+void deduce() {
+ auto lambda = [](int i) __attribute__ (( pcs("aapcs") )) {
+ return i;
+ };
+ lambda(42);
+}
+
OpenPOWER on IntegriCloud