summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>2016-01-30 01:51:20 +0000
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>2016-01-30 01:51:20 +0000
commitb4030df780ad1fb72c372764cb582fe2287aa595 (patch)
treeebb448fece9705bd3952ed2226d01d8cd0cfd648
parentfe28ccc98f2ce3970a7dd6ba4d09536ba2c3b472 (diff)
downloadbcm5719-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.cpp9
-rw-r--r--clang/test/SemaCXX/lambda-expressions.cpp11
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;
+ };
+}
+}
OpenPOWER on IntegriCloud