https://github.com/tbaederr created https://github.com/llvm/llvm-project/pull/128290
The follow-up diagnostic would otherwise be: array.cpp:111:33: note: undefined constructor '(unnamed struct at array.cpp:111:11)' cannot be used in a constant expression array.cpp:111:11: note: declared here 111 | constexpr struct { Unknown U; } InvalidCtor; | ^ ... and complaining about the undefined constructor of a class that is invalid anyway doesn't make much sense. >From 5128abac545f1e86042cf1aa72374df070e4dbc2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timm=20B=C3=A4der?= <tbae...@redhat.com> Date: Sat, 22 Feb 2025 07:29:02 +0100 Subject: [PATCH] [clang][bytecode] Silently reject ctors of invalid decls The follow-up diagnostic would otherwise be: array.cpp:111:33: note: undefined constructor '(unnamed struct at array.cpp:111:11)' cannot be used in a constant expression array.cpp:111:11: note: declared here 111 | constexpr struct { Unknown U; } InvalidCtor; | ^ ... and complaining about the undefined constructor of a class that is invalid anyway doesn't make much sense. --- clang/lib/AST/ByteCode/Interp.cpp | 5 +++++ clang/test/AST/ByteCode/records.cpp | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/clang/lib/AST/ByteCode/Interp.cpp b/clang/lib/AST/ByteCode/Interp.cpp index c07690a3d941c..dfa59a50b2711 100644 --- a/clang/lib/AST/ByteCode/Interp.cpp +++ b/clang/lib/AST/ByteCode/Interp.cpp @@ -732,6 +732,11 @@ bool CheckCallable(InterpState &S, CodePtr OpPC, const Function *F) { DiagDecl = CD = Inherited; } + // Silently reject constructors of invalid classes. The invalid class + // has been rejected elsewhere before. + if (CD && CD->getParent()->isInvalidDecl()) + return false; + // 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. diff --git a/clang/test/AST/ByteCode/records.cpp b/clang/test/AST/ByteCode/records.cpp index a13f30cd23119..608b94e55560a 100644 --- a/clang/test/AST/ByteCode/records.cpp +++ b/clang/test/AST/ByteCode/records.cpp @@ -1734,3 +1734,8 @@ namespace DeadUpcast { static_assert(foo(), ""); } #endif + +namespace CtorOfInvalidClass { + constexpr struct { Unknown U; } InvalidCtor; // both-error {{unknown type name 'Unknown'}} \ + // both-error {{must be initialized by a constant expression}} +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits