[clang] [Sema]Report error for non-base types in constructor initializers before causing issue in initializer order (PR #201379)
Gábor Spaits via cfe-commits
cfe-commits at lists.llvm.org
Wed Jun 3 08:06:30 PDT 2026
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 <gaborspaits1 at gmail.com>
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;
+};
+}
More information about the cfe-commits
mailing list