https://github.com/spaits created https://github.com/llvm/llvm-project/pull/201379
None From e741471e5675949916a6ef83f54ec45eab103321 Mon Sep 17 00:00:00 2001 From: Gabor Spaits <[email protected]> Date: Wed, 3 Jun 2026 17:05:33 +0200 Subject: [PATCH] [Sema] Report error for non-base types in constructor initializers before causing issue in initializer order --- clang/lib/Sema/SemaDeclCXX.cpp | 5 +++-- clang/test/SemaCXX/constructor-initializer.cpp | 8 ++++++++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index de837ff0608d0..c1b6eb88959d7 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -4819,8 +4819,9 @@ Sema::BuildBaseInitializer(QualType BaseType, TypeSourceInfo *BaseTInfo, // Check for direct and virtual base classes. const CXXBaseSpecifier *DirectBaseSpec = nullptr; const CXXBaseSpecifier *VirtualBaseSpec = nullptr; - if (!Dependent) { - if (declaresSameEntity(ClassDecl, BaseType->getAsCXXRecordDecl())) + if (!Dependent || !ClassDecl->hasAnyDependentBases()) { + if (!Dependent && + declaresSameEntity(ClassDecl, BaseType->getAsCXXRecordDecl())) return BuildDelegatingInitializer(BaseTInfo, Init, ClassDecl); FindBaseInitializer(*this, ClassDecl, BaseType, DirectBaseSpec, diff --git a/clang/test/SemaCXX/constructor-initializer.cpp b/clang/test/SemaCXX/constructor-initializer.cpp index 96be8dda97735..8627b6d12e5fe 100644 --- a/clang/test/SemaCXX/constructor-initializer.cpp +++ b/clang/test/SemaCXX/constructor-initializer.cpp @@ -323,3 +323,11 @@ A f2(const B &b) { return b; // expected-error {{no matching constructor for initialization of 'B'}} } } + +namespace PR_NO_NUMBER_YET { +struct a1 { + template<typename c> + a1(c) : d(), c() {} // expected-error {{type 'c' is not a direct or virtual base of 'PR_NO_NUMBER_YET::a1'}} + int d; +}; +} _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
