Fix a crash when the size of an 'auto' is needed and its initalizer

contained a typo correction (the auto decl was being marked as dependent
unnecessarily, which triggered an assertion in cases where the size of
the type is needed).

llvm-svn: 232568
This commit is contained in:
Kaelyn Takata 2015-03-17 23:50:12 +00:00
parent c9d9610317
commit 3587fff95e
2 changed files with 31 additions and 0 deletions

View File

@ -8688,6 +8688,20 @@ void Sema::AddInitializerToDecl(Decl *RealDecl, Expr *Init,
// C++11 [decl.spec.auto]p6. Deduce the type which 'auto' stands in for. // C++11 [decl.spec.auto]p6. Deduce the type which 'auto' stands in for.
if (TypeMayContainAuto && VDecl->getType()->isUndeducedType()) { if (TypeMayContainAuto && VDecl->getType()->isUndeducedType()) {
// Attempt typo correction early so that the type of the init expression can
// be deduced based on the chosen correction:if the original init contains a
// TypoExpr.
ExprResult Res = CorrectDelayedTyposInExpr(Init);
if (!Res.isUsable()) {
RealDecl->setInvalidDecl();
return;
}
if (Res.get() != Init) {
Init = Res.get();
if (CXXDirectInit)
CXXDirectInit = dyn_cast<ParenListExpr>(Init);
}
Expr *DeduceInit = Init; Expr *DeduceInit = Init;
// Initializer could be a C++ direct-initializer. Deduction only works if it // Initializer could be a C++ direct-initializer. Deduction only works if it
// contains exactly one expression. // contains exactly one expression.

View File

@ -74,3 +74,20 @@ namespace b6981007 {
} }
} }
} }
namespace incorrect_auto_type_deduction_for_typo {
struct S {
template <typename T> S(T t) {
(void)sizeof(t);
(void)new auto(t);
}
};
void Foo(S);
void test(int some_number) { // expected-note {{'some_number' declared here}}
auto x = sum_number; // expected-error {{use of undeclared identifier 'sum_number'; did you mean 'some_number'?}}
auto lambda = [x] {};
Foo(lambda);
}
}