]> granicus.if.org Git - clang/commitdiff
Sema: handle AttributedTypeLocs in C++14 auto deduction
authorSaleem Abdulrasool <compnerd@compnerd.org>
Wed, 15 Oct 2014 21:37:55 +0000 (21:37 +0000)
committerSaleem Abdulrasool <compnerd@compnerd.org>
Wed, 15 Oct 2014 21:37:55 +0000 (21:37 +0000)
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.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@219851 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaStmt.cpp
test/Sema/attributed-auto-deduction.cpp [new file with mode: 0644]

index 464206eafe31b8192b6c6e1c9bea8ced15ab2e2c..c03ac86de05f03849b210d18a9c05601861197f8 100644 (file)
@@ -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/test/Sema/attributed-auto-deduction.cpp b/test/Sema/attributed-auto-deduction.cpp
new file mode 100644 (file)
index 0000000..d8dc43d
--- /dev/null
@@ -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);
+}
+