[clang] 28c2bdf - [AST] Record SourceLocation for TypoExpr.
Haojian Wu via cfe-commits
cfe-commits at lists.llvm.org
Fri Jun 5 08:03:48 PDT 2020
Author: Haojian Wu
Date: 2020-06-05T17:03:32+02:00
New Revision: 28c2bdf18f508460401ba1d6958de87b27d52618
URL: https://github.com/llvm/llvm-project/commit/28c2bdf18f508460401ba1d6958de87b27d52618
DIFF: https://github.com/llvm/llvm-project/commit/28c2bdf18f508460401ba1d6958de87b27d52618.diff
LOG: [AST] Record SourceLocation for TypoExpr.
Reviewers: sammccall
Subscribers: cfe-commits
Tags: #clang
Differential Revision: https://reviews.llvm.org/D81008
Added:
Modified:
clang/include/clang/AST/Expr.h
clang/include/clang/Sema/Sema.h
clang/lib/Sema/SemaExprCXX.cpp
clang/lib/Sema/SemaLookup.cpp
clang/test/AST/ast-dump-recovery.cpp
Removed:
################################################################################
diff --git a/clang/include/clang/AST/Expr.h b/clang/include/clang/AST/Expr.h
index 4de2259ebaf3..670c0fe80b4e 100644
--- a/clang/include/clang/AST/Expr.h
+++ b/clang/include/clang/AST/Expr.h
@@ -6152,8 +6152,12 @@ class AtomicExpr : public Expr {
/// TypoExpr - Internal placeholder for expressions where typo correction
/// still needs to be performed and/or an error diagnostic emitted.
class TypoExpr : public Expr {
+ // The location for the typo name.
+ SourceLocation TypoLoc;
+
public:
- TypoExpr(QualType T) : Expr(TypoExprClass, T, VK_LValue, OK_Ordinary) {
+ TypoExpr(QualType T, SourceLocation TypoLoc)
+ : Expr(TypoExprClass, T, VK_LValue, OK_Ordinary), TypoLoc(TypoLoc) {
assert(T->isDependentType() && "TypoExpr given a non-dependent type");
setDependence(ExprDependence::TypeValueInstantiation |
ExprDependence::Error);
@@ -6166,8 +6170,8 @@ class TypoExpr : public Expr {
return const_child_range(const_child_iterator(), const_child_iterator());
}
- SourceLocation getBeginLoc() const LLVM_READONLY { return SourceLocation(); }
- SourceLocation getEndLoc() const LLVM_READONLY { return SourceLocation(); }
+ SourceLocation getBeginLoc() const LLVM_READONLY { return TypoLoc; }
+ SourceLocation getEndLoc() const LLVM_READONLY { return TypoLoc; }
static bool classof(const Stmt *T) {
return T->getStmtClass() == TypoExprClass;
diff --git a/clang/include/clang/Sema/Sema.h b/clang/include/clang/Sema/Sema.h
index 2a71d01d6edb..5f0a03b1c93f 100644
--- a/clang/include/clang/Sema/Sema.h
+++ b/clang/include/clang/Sema/Sema.h
@@ -3695,7 +3695,7 @@ class Sema final {
/// Creates a new TypoExpr AST node.
TypoExpr *createDelayedTypo(std::unique_ptr<TypoCorrectionConsumer> TCC,
TypoDiagnosticGenerator TDG,
- TypoRecoveryCallback TRC);
+ TypoRecoveryCallback TRC, SourceLocation TypoLoc);
// The set of known/encountered (unique, canonicalized) NamespaceDecls.
//
diff --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp
index 9c4e5b4a7848..c22af86d57aa 100644
--- a/clang/lib/Sema/SemaExprCXX.cpp
+++ b/clang/lib/Sema/SemaExprCXX.cpp
@@ -8307,8 +8307,6 @@ ExprResult Sema::ActOnFinishFullExpr(Expr *FE, SourceLocation CC,
if (FullExpr.isInvalid()) {
// Typo-correction fails, we rebuild the broken AST with the typos degraded
// to RecoveryExpr.
- // FIXME: we lose source locations for RecoveryExpr, as TypoExpr doesn't
- // track source locations.
struct TyposReplace : TreeTransform<TyposReplace> {
TyposReplace(Sema &SemaRef) : TreeTransform(SemaRef) {}
ExprResult TransformTypoExpr(TypoExpr *E) {
diff --git a/clang/lib/Sema/SemaLookup.cpp b/clang/lib/Sema/SemaLookup.cpp
index dbbd190caea9..0afb75752c12 100644
--- a/clang/lib/Sema/SemaLookup.cpp
+++ b/clang/lib/Sema/SemaLookup.cpp
@@ -5167,9 +5167,9 @@ TypoExpr *Sema::CorrectTypoDelayed(
IdentifierInfo *Typo = TypoName.getName().getAsIdentifierInfo();
if (!ExternalTypo && ED > 0 && Typo->getName().size() / ED < 3)
return nullptr;
-
ExprEvalContexts.back().NumTypos++;
- return createDelayedTypo(std::move(Consumer), std::move(TDG), std::move(TRC));
+ return createDelayedTypo(std::move(Consumer), std::move(TDG), std::move(TRC),
+ TypoName.getLoc());
}
void TypoCorrection::addCorrectionDecl(NamedDecl *CDecl) {
@@ -5481,9 +5481,10 @@ void Sema::diagnoseTypo(const TypoCorrection &Correction,
TypoExpr *Sema::createDelayedTypo(std::unique_ptr<TypoCorrectionConsumer> TCC,
TypoDiagnosticGenerator TDG,
- TypoRecoveryCallback TRC) {
+ TypoRecoveryCallback TRC,
+ SourceLocation TypoLoc) {
assert(TCC && "createDelayedTypo requires a valid TypoCorrectionConsumer");
- auto TE = new (Context) TypoExpr(Context.DependentTy);
+ auto TE = new (Context) TypoExpr(Context.DependentTy, TypoLoc);
auto &State = DelayedTypos[TE];
State.Consumer = std::move(TCC);
State.DiagHandler = std::move(TDG);
diff --git a/clang/test/AST/ast-dump-recovery.cpp b/clang/test/AST/ast-dump-recovery.cpp
index 6d271cebc7f9..e2a715130628 100644
--- a/clang/test/AST/ast-dump-recovery.cpp
+++ b/clang/test/AST/ast-dump-recovery.cpp
@@ -13,9 +13,9 @@ int invalid_call = some_func(123);
void test_invalid_call(int s) {
// CHECK: CallExpr {{.*}} '<dependent type>' contains-errors
// CHECK-NEXT: |-UnresolvedLookupExpr {{.*}} 'some_func'
- // CHECK-NEXT: |-RecoveryExpr {{.*}} <<invalid sloc>>
- // CHECK-NEXT: `-BinaryOperator {{.*}} <<invalid sloc>, col:28>
- // CHECK-NEXT: |-RecoveryExpr {{.*}} <<invalid sloc>>
+ // CHECK-NEXT: |-RecoveryExpr {{.*}} <col:13>
+ // CHECK-NEXT: `-BinaryOperator {{.*}}
+ // CHECK-NEXT: |-RecoveryExpr {{.*}}
// CHECK-NEXT: `-IntegerLiteral {{.*}} <col:28> 'int' 1
some_func(undef1, undef2+1);
More information about the cfe-commits
mailing list