Skip to content

Commit 05211da

Browse files
committed
Sema: filter out invalid base-specifiers before attaching
ActOnBaseSpecifiers now skips nullptr entries returned for invalid bases, avoiding ICE on invalid inheritance. Added regression test in SemaCXX/invalid-inheritance.cpp. Fixes #147186 Signed-off-by: Shashi Shankar <[email protected]>
1 parent 494253f commit 05211da

File tree

2 files changed

+29
-1
lines changed

2 files changed

+29
-1
lines changed

clang/lib/Sema/SemaDeclCXX.cpp

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3031,8 +3031,23 @@ void Sema::ActOnBaseSpecifiers(Decl *ClassDecl,
30313031
if (!ClassDecl || Bases.empty())
30323032
return;
30333033

3034+
// --- drop any bases already diagnosed invalid ---
3035+
SmallVector<CXXBaseSpecifier *, 4> ValidBases;
3036+
ValidBases.reserve(Bases.size());
3037+
for (auto *BS : Bases)
3038+
if (BS)
3039+
ValidBases.push_back(BS);
3040+
if (ValidBases.empty())
3041+
return;
3042+
3043+
if (ValidBases.empty())
3044+
return; // nothing valid to attach
3045+
30343046
AdjustDeclIfTemplate(ClassDecl);
3035-
AttachBaseSpecifiers(cast<CXXRecordDecl>(ClassDecl), Bases);
3047+
// Attach only the valid bases so downstream never ICEs
3048+
AttachBaseSpecifiers(cast<CXXRecordDecl>(ClassDecl),
3049+
llvm::MutableArrayRef<CXXBaseSpecifier *>(
3050+
ValidBases.data(), ValidBases.size()));
30363051
}
30373052

30383053
bool Sema::IsDerivedFrom(SourceLocation Loc, CXXRecordDecl *Derived,
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
// Tests that invalid base-specifiers no longer crash the compiler.
2+
// RUN: %clang_cc1 -std=c++20 -fsyntax-only -verify %s
3+
4+
class X; // expected-note {{forward declaration of 'X'}} expected-note {{forward declaration of 'X'}}
5+
6+
class A : X { // expected-error {{base class has incomplete type}}
7+
};
8+
9+
class Y : int { // expected-error {{expected class name}}
10+
};
11+
12+
class Z : X*, virtual int { // expected-error {{base class has incomplete type}} expected-error {{expected class name}}
13+
};

0 commit comments

Comments
 (0)