[clang] Provide source range to 'invalid subexpr in const expr' diags

Differential Revision: https://reviews.llvm.org/D150566
This commit is contained in:
Timm Bäder 2023-05-12 09:20:33 +02:00
parent fc12fd71cf
commit 7a3ad8ed77
7 changed files with 33 additions and 3 deletions

View File

@ -5227,7 +5227,7 @@ static EvalStmtResult EvaluateStmt(StmtResult &Result, EvalInfo &Info,
return ESR_Succeeded;
}
Info.FFDiag(S->getBeginLoc());
Info.FFDiag(S->getBeginLoc()) << S->getSourceRange();
return ESR_Failed;
case Stmt::NullStmtClass:
@ -7454,7 +7454,7 @@ public:
/// Report an evaluation error. This should only be called when an error is
/// first discovered. When propagating an error, just return false.
bool Error(const Expr *E, diag::kind D) {
Info.FFDiag(E, D);
Info.FFDiag(E, D) << E->getSourceRange();
return false;
}
bool Error(const Expr *E) {

View File

@ -1738,7 +1738,8 @@ inline bool GetFnPtr(InterpState &S, CodePtr OpPC, const Function *Func) {
/// op is not valid in a constant context.
inline bool Invalid(InterpState &S, CodePtr OpPC) {
const SourceLocation &Loc = S.Current->getLocation(OpPC);
S.FFDiag(Loc, diag::note_invalid_subexpr_in_const_expr);
S.FFDiag(Loc, diag::note_invalid_subexpr_in_const_expr)
<< S.Current->getRange(OpPC);
return false;
}

View File

@ -229,3 +229,6 @@ SourceLocation InterpFrame::getLocation(CodePtr PC) const {
return S.getLocation(Func, PC);
}
SourceRange InterpFrame::getRange(CodePtr PC) const {
return S.getRange(Func, PC);
}

View File

@ -118,6 +118,7 @@ public:
virtual SourceInfo getSource(CodePtr PC) const;
const Expr *getExpr(CodePtr PC) const;
SourceLocation getLocation(CodePtr PC) const;
SourceRange getRange(CodePtr PC) const;
unsigned getDepth() const { return Depth; }

View File

@ -22,6 +22,16 @@ SourceLocation SourceInfo::getLoc() const {
return SourceLocation();
}
SourceRange SourceInfo::getRange() const {
if (const Expr *E = asExpr())
return E->getSourceRange();
if (const Stmt *S = asStmt())
return S->getSourceRange();
if (const Decl *D = asDecl())
return D->getSourceRange();
return SourceRange();
}
const Expr *SourceInfo::asExpr() const {
if (auto *S = Source.dyn_cast<const Stmt *>())
return dyn_cast<Expr>(S);
@ -37,3 +47,7 @@ const Expr *SourceMapper::getExpr(const Function *F, CodePtr PC) const {
SourceLocation SourceMapper::getLocation(const Function *F, CodePtr PC) const {
return getSource(F, PC).getLoc();
}
SourceRange SourceMapper::getRange(const Function *F, CodePtr PC) const {
return getSource(F, PC).getRange();
}

View File

@ -71,6 +71,7 @@ public:
SourceInfo(const Decl *D) : Source(D) {}
SourceLocation getLoc() const;
SourceRange getRange() const;
const Stmt *asStmt() const { return Source.dyn_cast<const Stmt *>(); }
const Decl *asDecl() const { return Source.dyn_cast<const Decl *>(); }
@ -96,6 +97,7 @@ public:
const Expr *getExpr(const Function *F, CodePtr PC) const;
/// Returns the location from which an opcode originates.
SourceLocation getLocation(const Function *F, CodePtr PC) const;
SourceRange getRange(const Function *F, CodePtr PC) const;
};
} // namespace interp

View File

@ -0,0 +1,9 @@
// RUN: not %clang_cc1 -fsyntax-only -fdiagnostics-print-source-range-info -fcxx-exceptions %s 2>&1 | FileCheck %s
// RUN: not %clang_cc1 -fsyntax-only -fexperimental-new-constant-interpreter -fdiagnostics-print-source-range-info -fcxx-exceptions %s 2>&1 | FileCheck %s
constexpr int f() {
throw 1;
return 0;
}
// CHECK: constexpr-source-ranges.cpp:5:3:{5:3-5:10}