Skip to content

Commit

Permalink
[clang] Provide source range to 'invalid subexpr in const expr' diags
Browse files Browse the repository at this point in the history
Differential Revision: https://reviews.llvm.org/D150566
  • Loading branch information
tbaederr committed Jul 26, 2023
1 parent fc12fd7 commit 7a3ad8e
Show file tree
Hide file tree
Showing 7 changed files with 33 additions and 3 deletions.
4 changes: 2 additions & 2 deletions clang/lib/AST/ExprConstant.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down Expand Up @@ -7454,7 +7454,7 @@ class ExprEvaluatorBase
/// 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) {
Expand Down
3 changes: 2 additions & 1 deletion clang/lib/AST/Interp/Interp.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand Down
3 changes: 3 additions & 0 deletions clang/lib/AST/Interp/InterpFrame.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
1 change: 1 addition & 0 deletions clang/lib/AST/Interp/InterpFrame.h
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,7 @@ class InterpFrame final : public Frame {
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; }

Expand Down
14 changes: 14 additions & 0 deletions clang/lib/AST/Interp/Source.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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();
}
2 changes: 2 additions & 0 deletions clang/lib/AST/Interp/Source.h
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ class SourceInfo final {
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 *>(); }
Expand All @@ -96,6 +97,7 @@ class SourceMapper {
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
Expand Down
9 changes: 9 additions & 0 deletions clang/test/Misc/constexpr-source-ranges.cpp
Original file line number Diff line number Diff line change
@@ -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}

0 comments on commit 7a3ad8e

Please sign in to comment.