[clang] [clang][Interp] Don't diagnose undefined functions when checking... (PR #75051)
via cfe-commits
cfe-commits at lists.llvm.org
Mon Dec 11 06:15:06 PST 2023
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang
Author: Timm Baeder (tbaederr)
<details>
<summary>Changes</summary>
... for a potential constant expression. They are not defined now, but might be defined later when the function is actually called.
---
Full diff: https://github.com/llvm/llvm-project/pull/75051.diff
2 Files Affected:
- (modified) clang/lib/AST/Interp/Interp.cpp (+11-8)
- (modified) clang/test/AST/Interp/functions.cpp (+11)
``````````diff
diff --git a/clang/lib/AST/Interp/Interp.cpp b/clang/lib/AST/Interp/Interp.cpp
index 13b77e9a87725c..29d9dcbf9c3069 100644
--- a/clang/lib/AST/Interp/Interp.cpp
+++ b/clang/lib/AST/Interp/Interp.cpp
@@ -350,11 +350,6 @@ bool CheckCallable(InterpState &S, CodePtr OpPC, const Function *F) {
}
if (!F->isConstexpr()) {
- // Don't emit anything if we're checking for a potential constant
- // expression. That will happen later when actually executing.
- if (S.checkingPotentialConstantExpression())
- return false;
-
const SourceLocation &Loc = S.Current->getLocation(OpPC);
if (S.getLangOpts().CPlusPlus11) {
const FunctionDecl *DiagDecl = F->getDecl();
@@ -371,13 +366,21 @@ bool CheckCallable(InterpState &S, CodePtr OpPC, const Function *F) {
// FIXME: If DiagDecl is an implicitly-declared special member function
// or an inheriting constructor, we should be much more explicit about why
// it's not constexpr.
- if (CD && CD->isInheritingConstructor())
+ if (CD && CD->isInheritingConstructor()) {
S.FFDiag(Loc, diag::note_constexpr_invalid_inhctor, 1)
<< CD->getInheritedConstructor().getConstructor()->getParent();
- else
+ S.Note(DiagDecl->getLocation(), diag::note_declared_at);
+ } else {
+ // Don't emit anything if the function isn't defined and we're checking
+ // for a constnat expression. It might be defined at the point we're
+ // actually calling it.
+ if (!DiagDecl->isDefined() && S.checkingPotentialConstantExpression())
+ return false;
+
S.FFDiag(Loc, diag::note_constexpr_invalid_function, 1)
<< DiagDecl->isConstexpr() << (bool)CD << DiagDecl;
- S.Note(DiagDecl->getLocation(), diag::note_declared_at);
+ S.Note(DiagDecl->getLocation(), diag::note_declared_at);
+ }
} else {
S.FFDiag(Loc, diag::note_invalid_subexpr_in_const_expr);
}
diff --git a/clang/test/AST/Interp/functions.cpp b/clang/test/AST/Interp/functions.cpp
index ab562e70606b67..179a195098b132 100644
--- a/clang/test/AST/Interp/functions.cpp
+++ b/clang/test/AST/Interp/functions.cpp
@@ -267,6 +267,17 @@ namespace InvalidCall {
// ref-error {{must be initialized by a constant expression}} \
// ref-note {{in call to 'SS()'}}
+
+ /// This should not emit a diagnostic.
+ constexpr int f();
+ constexpr int a() {
+ return f();
+ }
+ constexpr int f() {
+ return 5;
+ }
+ static_assert(a() == 5, "");
+
}
namespace CallWithArgs {
``````````
</details>
https://github.com/llvm/llvm-project/pull/75051
More information about the cfe-commits
mailing list