forked from OSchip/llvm-project
[AST] Record SourceLocation for TypoExpr.
Reviewers: sammccall Subscribers: cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D81008
This commit is contained in:
parent
8948eab28a
commit
28c2bdf18f
|
@ -6152,8 +6152,12 @@ public:
|
|||
/// 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 @@ public:
|
|||
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;
|
||||
|
|
|
@ -3695,7 +3695,7 @@ private:
|
|||
/// 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.
|
||||
//
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
Loading…
Reference in New Issue