Typo correct the condition of 'do-while' before exiting its scope

rdar://35172419

llvm-svn: 316966
This commit is contained in:
Alex Lorenz 2017-10-30 22:55:11 +00:00
parent a544c51e94
commit c38ba6697f
2 changed files with 36 additions and 1 deletions

View File

@ -1479,6 +1479,9 @@ StmtResult Parser::ParseDoStatement() {
DiagnoseAndSkipCXX11Attributes();
ExprResult Cond = ParseExpression();
// Correct the typos in condition before closing the scope.
if (Cond.isUsable())
Cond = Actions.CorrectDelayedTyposInExpr(Cond);
T.consumeClose();
DoScope.Exit();

View File

@ -1,4 +1,4 @@
// RUN: %clang_cc1 %s -verify -fsyntax-only
// RUN: %clang_cc1 %s -verify -fsyntax-only -Wno-objc-root-class
class ClassA {};
@ -55,3 +55,35 @@ void invalidNameInIvarAndPropertyBase() {
typoCandidate.x = 0; // expected-error {{use of undeclared identifier 'typoCandidate'; did you mean '_typoCandidate'?}}
}
@end
// rdar://35172419
// The scope of 'do-while' ends before typo-correction takes place.
struct Mat2 { int rows; };
@implementation ImplNoInt // expected-warning {{cannot find interface declaration for 'ImplNoInt'}}
- (void)typoCorrentInDoWhile {
Mat2 tlMat1; // expected-note {{'tlMat1' declared here}}
// Create many scopes to exhaust the cache.
do {
for (int index = 0; index < 2; index++) {
if (true) {
for (int specialTileType = 1; specialTileType < 5; specialTileType++) {
for (int i = 0; i < 10; i++) {
for (double scale = 0.95; scale <= 1.055; scale += 0.05) {
for (int j = 0; j < 10; j++) {
if (1 > 0.9) {
for (int sptile = 1; sptile < 5; sptile++) {
}
}
}
}
}
}
}
}
} while (tlMat.rows); // expected-error {{use of undeclared identifier 'tlMat'; did you mean 'tlMat1'}}
}
@end