mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-03-06 17:41:22 +00:00
[clang] Provide source range to 'invalid subexpr in const expr' diags
Differential Revision: https://reviews.llvm.org/D150566
This commit is contained in:
parent
fc12fd71cf
commit
7a3ad8ed77
@ -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) {
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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; }
|
||||
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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
|
||||
|
9
clang/test/Misc/constexpr-source-ranges.cpp
Normal file
9
clang/test/Misc/constexpr-source-ranges.cpp
Normal 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}
|
Loading…
x
Reference in New Issue
Block a user