diff options
author | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2016-01-30 01:51:20 +0000 |
---|---|---|
committer | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2016-01-30 01:51:20 +0000 |
commit | b4030df780ad1fb72c372764cb582fe2287aa595 (patch) | |
tree | ebb448fece9705bd3952ed2226d01d8cd0cfd648 | |
parent | fe28ccc98f2ce3970a7dd6ba4d09536ba2c3b472 (diff) | |
download | bcm5719-llvm-b4030df780ad1fb72c372764cb582fe2287aa595.tar.gz bcm5719-llvm-b4030df780ad1fb72c372764cb582fe2287aa595.zip |
[SemaCXX] Fix crash-on-invalid while trying to deduce return type of a lambda.
rdar://22032373
llvm-svn: 259287
-rw-r--r-- | clang/lib/Sema/SemaStmt.cpp | 9 | ||||
-rw-r--r-- | clang/test/SemaCXX/lambda-expressions.cpp | 11 |
2 files changed, 16 insertions, 4 deletions
diff --git a/clang/lib/Sema/SemaStmt.cpp b/clang/lib/Sema/SemaStmt.cpp index e1b1a47e182..d73441646bb 100644 --- a/clang/lib/Sema/SemaStmt.cpp +++ b/clang/lib/Sema/SemaStmt.cpp @@ -3066,22 +3066,23 @@ bool Sema::DeduceFunctionTypeFromReturnExpr(FunctionDecl *FD, // has multiple return statements, the return type is deduced for each return // statement. [...] if the type deduced is not the same in each deduction, // the program is ill-formed. - if (AT->isDeduced() && !FD->isInvalidDecl()) { + QualType DeducedT = AT->getDeducedType(); + if (!DeducedT.isNull() && !FD->isInvalidDecl()) { AutoType *NewAT = Deduced->getContainedAutoType(); CanQualType OldDeducedType = Context.getCanonicalFunctionResultType( - AT->getDeducedType()); + DeducedT); CanQualType NewDeducedType = Context.getCanonicalFunctionResultType( NewAT->getDeducedType()); if (!FD->isDependentContext() && OldDeducedType != NewDeducedType) { const LambdaScopeInfo *LambdaSI = getCurLambda(); if (LambdaSI && LambdaSI->HasImplicitReturnType) { Diag(ReturnLoc, diag::err_typecheck_missing_return_type_incompatible) - << NewAT->getDeducedType() << AT->getDeducedType() + << NewAT->getDeducedType() << DeducedT << true /*IsLambda*/; } else { Diag(ReturnLoc, diag::err_auto_fn_different_deductions) << (AT->isDecltypeAuto() ? 1 : 0) - << NewAT->getDeducedType() << AT->getDeducedType(); + << NewAT->getDeducedType() << DeducedT; } return true; } diff --git a/clang/test/SemaCXX/lambda-expressions.cpp b/clang/test/SemaCXX/lambda-expressions.cpp index 72adcdbce2f..08446a0ee43 100644 --- a/clang/test/SemaCXX/lambda-expressions.cpp +++ b/clang/test/SemaCXX/lambda-expressions.cpp @@ -476,3 +476,14 @@ int main() { A<int> a; } + +// rdar://22032373 +namespace rdar22032373 { +void foo() { + auto blk = [](bool b) { + if (b) + return undeclared_error; // expected-error {{use of undeclared identifier}} + return 0; + }; +} +} |