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.
|
||||
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;
|
||||
// Initializer could be a C++ direct-initializer. Deduction only works if it
|
||||
// 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