From 374b5aa170ba648e88ba36569b0c0ec698b9a3ef Mon Sep 17 00:00:00 2001 From: Saleem Abdulrasool Date: Thu, 16 Oct 2014 22:42:53 +0000 Subject: [PATCH] Sema: handle additional case of qualified types A second instance of attributed types escaped the previous change, identified thanks to Richard Smith! When deducing the void case, we would also assume that the type would not be attributed. Furthermore, properly handle multiple attributes being applied to a single TypeLoc. Properly handle this case and future-proof a bit by ignoring parenthesis further. The test cases do use the additional parenthesis to ensure that this case remains properly handled. Addresses post-commit review comments from Richard Smith to SVN r219851. llvm-svn: 219974 --- clang/include/clang/Sema/Sema.h | 2 ++ clang/lib/Sema/SemaDecl.cpp | 3 +-- clang/lib/Sema/SemaStmt.cpp | 13 ++++++++----- clang/test/SemaCXX/attributed-auto-deduction.cpp | 14 ++++++++++++-- 4 files changed, 23 insertions(+), 9 deletions(-) diff --git a/clang/include/clang/Sema/Sema.h b/clang/include/clang/Sema/Sema.h index f4579c2..3723654 100644 --- a/clang/include/clang/Sema/Sema.h +++ b/clang/include/clang/Sema/Sema.h @@ -6104,6 +6104,8 @@ public: bool DeduceReturnType(FunctionDecl *FD, SourceLocation Loc, bool Diagnose = true); + TypeLoc getReturnTypeLoc(FunctionDecl *FD) const; + bool DeduceFunctionTypeFromReturnExpr(FunctionDecl *FD, SourceLocation ReturnLoc, Expr *&RetExpr, AutoType *AT); diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index 6f20c6a..3126635 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -10414,8 +10414,7 @@ Decl *Sema::ActOnFinishFunctionBody(Decl *dcl, Stmt *Body, FD->setInvalidDecl(); } else { // Substitute 'void' for the 'auto' in the type. - TypeLoc ResultType = FD->getTypeSourceInfo()->getTypeLoc(). - IgnoreParens().castAs().getReturnLoc(); + TypeLoc ResultType = getReturnTypeLoc(FD); Context.adjustDeducedFunctionResultType( FD, SubstAutoType(ResultType.getType(), Context.VoidTy)); } diff --git a/clang/lib/Sema/SemaStmt.cpp b/clang/lib/Sema/SemaStmt.cpp index 7efcb2e..8a28b29 100644 --- a/clang/lib/Sema/SemaStmt.cpp +++ b/clang/lib/Sema/SemaStmt.cpp @@ -2755,17 +2755,20 @@ bool LocalTypedefNameReferencer::VisitRecordType(const RecordType *RT) { } } +TypeLoc Sema::getReturnTypeLoc(FunctionDecl *FD) const { + TypeLoc TL = FD->getTypeSourceInfo()->getTypeLoc(); + while (auto ATL = TL.getAs()) + TL = ATL.getModifiedLoc().IgnoreParens(); + return TL.IgnoreParens().castAs().getReturnLoc(); +} + /// Deduce the return type for a function from a returned expression, per /// C++1y [dcl.spec.auto]p6. bool Sema::DeduceFunctionTypeFromReturnExpr(FunctionDecl *FD, SourceLocation ReturnLoc, Expr *&RetExpr, AutoType *AT) { - TypeLoc TL = FD->getTypeSourceInfo()->getTypeLoc(); - if (auto ATL = TL.getAs()) - TL = ATL.getModifiedLoc(); - TypeLoc OrigResultType = - TL.IgnoreParens().castAs().getReturnLoc(); + TypeLoc OrigResultType = getReturnTypeLoc(FD); QualType Deduced; if (RetExpr && isa(RetExpr)) { diff --git a/clang/test/SemaCXX/attributed-auto-deduction.cpp b/clang/test/SemaCXX/attributed-auto-deduction.cpp index d8dc43d..b0cae18 100644 --- a/clang/test/SemaCXX/attributed-auto-deduction.cpp +++ b/clang/test/SemaCXX/attributed-auto-deduction.cpp @@ -2,9 +2,19 @@ // expected-no-diagnostics void deduce() { - auto lambda = [](int i) __attribute__ (( pcs("aapcs") )) { + auto single_int = [](int i) __attribute__ (( pcs("aapcs") )) { return i; }; - lambda(42); + auto multiple_int = [](int i) __attribute__ (( pcs("aapcs") )) + __attribute__ (( pcs("aapcs") )) { + return i; + }; + + auto single_void = []() __attribute__ (( pcs("aapcs") )) { }; + auto multiple_void = []() __attribute__ (( pcs("aapcs") )) + __attribute__ (( pcs("aapcs") )) { }; } +auto ( __attribute__ (( pcs("aapcs") )) single_attribute() ) { } +auto ( ( __attribute__ (( pcs("aapcs") )) ( ( __attribute__ (( pcs("aapcs") )) multiple_attributes() ) ) ) ) { } + -- 2.7.4