Author: sammccall Date: Tue May 7 22:49:42 2019 New Revision: 360224 URL: http://llvm.org/viewvc/llvm-project?rev=360224&view=rev Log: [Sema] Correct typos in return statements so the return types of 'auto' functions are always deduced.
Summary: e.g. auto foo() { return no_such_thing; // Return value is a TypoExpr } using T = decltype(foo()); // Uh-oh, undeduced auto. Reviewers: rsmith Subscribers: cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D61649 Modified: cfe/trunk/lib/Sema/SemaStmt.cpp cfe/trunk/test/SemaCXX/typo-correction-crash.cpp Modified: cfe/trunk/lib/Sema/SemaStmt.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaStmt.cpp?rev=360224&r1=360223&r2=360224&view=diff ============================================================================== --- cfe/trunk/lib/Sema/SemaStmt.cpp (original) +++ cfe/trunk/lib/Sema/SemaStmt.cpp Tue May 7 22:49:42 2019 @@ -10,6 +10,7 @@ // //===----------------------------------------------------------------------===// +#include "clang/Sema/Ownership.h" #include "clang/Sema/SemaInternal.h" #include "clang/AST/ASTContext.h" #include "clang/AST/ASTDiagnostic.h" @@ -3503,7 +3504,12 @@ bool Sema::DeduceFunctionTypeFromReturnE StmtResult Sema::ActOnReturnStmt(SourceLocation ReturnLoc, Expr *RetValExp, Scope *CurScope) { - StmtResult R = BuildReturnStmt(ReturnLoc, RetValExp); + // Correct typos, in case the containing function returns 'auto' and + // RetValExp should determine the deduced type. + ExprResult RetVal = CorrectDelayedTyposInExpr(RetValExp); + if (RetVal.isInvalid()) + return StmtError(); + StmtResult R = BuildReturnStmt(ReturnLoc, RetVal.get()); if (R.isInvalid() || ExprEvalContexts.back().Context == ExpressionEvaluationContext::DiscardedStatement) return R; Modified: cfe/trunk/test/SemaCXX/typo-correction-crash.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/typo-correction-crash.cpp?rev=360224&r1=360223&r2=360224&view=diff ============================================================================== --- cfe/trunk/test/SemaCXX/typo-correction-crash.cpp (original) +++ cfe/trunk/test/SemaCXX/typo-correction-crash.cpp Tue May 7 22:49:42 2019 @@ -4,12 +4,23 @@ auto check1() { return s; // expected-error {{use of undeclared identifier 's'}} } -int test = 11; // expected-note {{'test' declared here}} +int test = 11; // expected-note 2 {{'test' declared here}} auto check2() { return "s"; return tes; // expected-error {{use of undeclared identifier 'tes'; did you mean 'test'?}} + // expected-error@-1 {{deduced as 'int' here but deduced as 'const char *' in earlier}} } +template <class A, class B> struct is_same { static constexpr bool value = false; }; +template <class A> struct is_same<A,A> { static constexpr bool value = true; }; + +auto L1 = [] { return s; }; // expected-error {{use of undeclared identifier 's'}} +using T1 = decltype(L1()); +static_assert(is_same<T1, void>::value, "Return statement should be discarded"); +auto L2 = [] { return tes; }; // expected-error {{use of undeclared identifier 'tes'; did you mean 'test'?}} +using T2 = decltype(L2()); +static_assert(is_same<T2, int>::value, "Return statement was corrected"); + namespace BarNamespace { namespace NestedNamespace { // expected-note {{'BarNamespace::NestedNamespace' declared here}} typedef int type; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits