r360224 - [Sema] Correct typos in return statements so the return types of 'auto' functions are always deduced.
Sam McCall via cfe-commits
cfe-commits at lists.llvm.org
Tue May 7 22:49:42 PDT 2019
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 at -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;
More information about the cfe-commits
mailing list