https://github.com/tbaederr created https://github.com/llvm/llvm-project/pull/128295
The copy constructor of an invalid declaration might still be perfectly valid, but we still need to reject it. >From 0dbe55f8a54048ea381ce39e641921c2a923475f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timm=20B=C3=A4der?= <tbae...@redhat.com> Date: Sat, 22 Feb 2025 08:40:29 +0100 Subject: [PATCH] [clang][bytecode] Always reject ctors of invalid parent decls The copy constructor of an invalid declaration might still be perfectly valid, but we still need to reject it. --- clang/lib/AST/ByteCode/Interp.cpp | 4 +++- clang/test/AST/ByteCode/records.cpp | 8 ++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/clang/lib/AST/ByteCode/Interp.cpp b/clang/lib/AST/ByteCode/Interp.cpp index dfa59a50b2711..e383828cd676d 100644 --- a/clang/lib/AST/ByteCode/Interp.cpp +++ b/clang/lib/AST/ByteCode/Interp.cpp @@ -1238,8 +1238,10 @@ static bool checkConstructor(InterpState &S, CodePtr OpPC, const Function *Func, const Pointer &ThisPtr) { assert(Func->isConstructor()); - const Descriptor *D = ThisPtr.getFieldDesc(); + if (Func->getParentDecl()->isInvalidDecl()) + return false; + const Descriptor *D = ThisPtr.getFieldDesc(); // FIXME: I think this case is not 100% correct. E.g. a pointer into a // subobject of a composite array. if (!D->ElemRecord) diff --git a/clang/test/AST/ByteCode/records.cpp b/clang/test/AST/ByteCode/records.cpp index 608b94e55560a..cb3d6111fd2bf 100644 --- a/clang/test/AST/ByteCode/records.cpp +++ b/clang/test/AST/ByteCode/records.cpp @@ -1738,4 +1738,12 @@ namespace DeadUpcast { namespace CtorOfInvalidClass { constexpr struct { Unknown U; } InvalidCtor; // both-error {{unknown type name 'Unknown'}} \ // both-error {{must be initialized by a constant expression}} + +#if __cplusplus >= 202002L + template <typename T, auto Q> + concept ReferenceOf = Q; + /// This calls a valid and constexpr copy constructor of InvalidCtor, + /// but should still be rejected. + template<ReferenceOf<InvalidCtor> auto R, typename Rep> int F; // both-error {{non-type template argument is not a constant expression}} +#endif } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits