forked from OSchip/llvm-project
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:
parent
c9d9610317
commit
3587fff95e
|
@ -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.
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue