[clang] e4798e7 - [clang][bytecode] Don't diagnose definition without body (#208679)
via cfe-commits
cfe-commits at lists.llvm.org
Fri Jul 10 03:51:44 PDT 2026
Author: Timm Baeder
Date: 2026-07-10T12:51:39+02:00
New Revision: e4798e75ccbc6f09e5b588713e82edc224f4b22a
URL: https://github.com/llvm/llvm-project/commit/e4798e75ccbc6f09e5b588713e82edc224f4b22a
DIFF: https://github.com/llvm/llvm-project/commit/e4798e75ccbc6f09e5b588713e82edc224f4b22a.diff
LOG: [clang][bytecode] Don't diagnose definition without body (#208679)
Let the declared_at note point to the declaration in that case.
Added:
Modified:
clang/lib/AST/ByteCode/Interp.cpp
clang/test/AST/ByteCode/invalid.cpp
Removed:
################################################################################
diff --git a/clang/lib/AST/ByteCode/Interp.cpp b/clang/lib/AST/ByteCode/Interp.cpp
index b2af27fc88542..0adcdfe6e78c9 100644
--- a/clang/lib/AST/ByteCode/Interp.cpp
+++ b/clang/lib/AST/ByteCode/Interp.cpp
@@ -1110,8 +1110,10 @@ static bool diagnoseCallableDecl(InterpState &S, CodePtr OpPC,
diag::note_constexpr_invalid_function, 1)
<< DiagDecl->isConstexpr() << (bool)CD << DiagDecl;
- if (DiagDecl->getDefinition())
- S.Note(DiagDecl->getDefinition()->getLocation(), diag::note_declared_at);
+ const FunctionDecl *Definition;
+ const Stmt *Body = DiagDecl->getBody(Definition);
+ if (Body && Definition)
+ S.Note(Definition->getLocation(), diag::note_declared_at);
else
S.Note(DiagDecl->getLocation(), diag::note_declared_at);
}
diff --git a/clang/test/AST/ByteCode/invalid.cpp b/clang/test/AST/ByteCode/invalid.cpp
index e79b698a32719..930565181b202 100644
--- a/clang/test/AST/ByteCode/invalid.cpp
+++ b/clang/test/AST/ByteCode/invalid.cpp
@@ -218,3 +218,12 @@ namespace InvalidVirtualCast {
static_assert((X *)(Y *)&z, ""); // both-error {{not an integral constant expression}} \
// both-note {{cast that performs the conversions of a reinterpret_cast is not allowed in a constant expression}}
}
+
+namespace DefinitionInBody {
+ int foo(); // both-note {{declared here}}
+ int foo() {
+ static_assert(foo() == 1); // both-error {{not an integral constant expression}} \
+ // both-note {{non-constexpr function 'foo' cannot be used in a constant expression}}
+ return 5;
+ }
+}
More information about the cfe-commits
mailing list