diff --git a/clang/lib/Parse/ParseExpr.cpp b/clang/lib/Parse/ParseExpr.cpp index ee8f4d9af672..a89036a98cb7 100644 --- a/clang/lib/Parse/ParseExpr.cpp +++ b/clang/lib/Parse/ParseExpr.cpp @@ -1366,7 +1366,9 @@ Parser::ParsePostfixExpressionSuffix(ExprResult LHS) { Idx.get(), RLoc); } else { (void)Actions.CorrectDelayedTyposInExpr(LHS); + (void)Actions.CorrectDelayedTyposInExpr(Idx); LHS = ExprError(); + Idx = ExprError(); } // Match the ']'. diff --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp index ad376f125421..1f9c1ea73cdd 100644 --- a/clang/lib/Sema/SemaExprCXX.cpp +++ b/clang/lib/Sema/SemaExprCXX.cpp @@ -5961,9 +5961,10 @@ static ExprResult attemptRecovery(Sema &SemaRef, NewSS = *SS; if (auto *ND = TC.getCorrectionDecl()) { + R.setLookupName(ND->getDeclName()); R.addDecl(ND); if (ND->isCXXClassMember()) { - // Figure out the correct naming class to ad to the LookupResult. + // Figure out the correct naming class to add to the LookupResult. CXXRecordDecl *Record = nullptr; if (auto *NNS = TC.getCorrectionSpecifier()) Record = NNS->getAsType()->getAsCXXRecordDecl(); diff --git a/clang/test/SemaCXX/typo-correction-pt2.cpp b/clang/test/SemaCXX/typo-correction-pt2.cpp index 5d3f1236ac26..73c8cb5a5542 100644 --- a/clang/test/SemaCXX/typo-correction-pt2.cpp +++ b/clang/test/SemaCXX/typo-correction-pt2.cpp @@ -332,3 +332,27 @@ int test(Foo f) { return 0; } }; + +namespace testMemberExprDeclarationNameInfo { + // The AST should only have the corrected name with no mention of 'data_'. + // FIXME: the second typo is being printed out with the location of the first + // because the TypoCorrection objects contain the SourceRange but the + // UnqualifiedTyposCorrected cache is keyed on IdentifierInfo. + void f(int); + struct S { + int data; // expected-note 2{{'data' declared here}} + void m_fn1() { + data_[] = // expected-error 2{{use of undeclared identifier 'data_'}} expected-error {{expected expression}} + f(data_); + } + }; +} + +namespace testArraySubscriptIndex { + struct S { + int foodata; // expected-note {{'foodata' declared here}} + void m_fn1() { + (+)[foodata_]; // expected-error{{expected expression}} expected-error {{use of undeclared identifier 'foodata_'; did you mean 'foodata'}} + } + }; +}