[clang] [NFC][Clang] Pre-commit test for assertion failure in template specialization error recovery (PR #208151)
Aditi Medhane via cfe-commits
cfe-commits at lists.llvm.org
Wed Jul 8 01:15:44 PDT 2026
https://github.com/AditiRM updated https://github.com/llvm/llvm-project/pull/208151
>From 9e282976c175ae845a720bca64ef270f5ff0df88 Mon Sep 17 00:00:00 2001
From: AditiRM <aditimedhane73 at gmail.com>
Date: Wed, 8 Jul 2026 06:48:50 +0000
Subject: [PATCH 1/2] [NFC][Clang] Pre-commit test for assertion failure in
template specialization error recovery
---
...ecialization-after-instantiation-crash.cpp | 40 +++++++++++++++++++
1 file changed, 40 insertions(+)
create mode 100644 clang/test/SemaCXX/explicit-specialization-after-instantiation-crash.cpp
diff --git a/clang/test/SemaCXX/explicit-specialization-after-instantiation-crash.cpp b/clang/test/SemaCXX/explicit-specialization-after-instantiation-crash.cpp
new file mode 100644
index 0000000000000..21a657b19822d
--- /dev/null
+++ b/clang/test/SemaCXX/explicit-specialization-after-instantiation-crash.cpp
@@ -0,0 +1,40 @@
+// Test for assertion failure when handling explicit template specialization after instantiation
+// This test documents the current crash behavior (will be fixed in subsequent patch)
+//
+// RUN: not --crash %clang_cc1 -fsyntax-only -verify %s 2>&1 | FileCheck %s
+//
+// REQUIRES: asserts
+
+// This test case triggers an assertion failure in getASTRecordLayout()
+// when the compiler encounters explicit specialization after instantiation
+// and attempts to get layout information during error recovery.
+
+template <typename T>
+struct X {
+ struct Y {
+ Y() : v(0) {}
+ int v;
+ int getValue();
+ } y;
+};
+
+template <typename T>
+int X<T>::Y::getValue() {
+ return ++v;
+}
+
+// expected-error at +1 {{explicit specialization of 'Y' after instantiation}}
+template <> struct X<int>::Y { int getValue() { return 55; } };
+// expected-note at -11 {{implicit instantiation first required here}}
+
+extern template class X<int>::Y;
+
+int main() {
+ X<int> x;
+ return x.y.getValue(); // expected-error {{no member named 'getValue'}}
+}
+
+// Verify the assertion failure occurs
+// CHECK: RecordLayoutBuilder.cpp
+// CHECK: Assertion{{.*}}!D->isInvalidDecl()
+// CHECK: Cannot get layout of invalid decl
>From bf48aaa1d6af87e67099cca3730fa1b85bc07e8b Mon Sep 17 00:00:00 2001
From: AditiRM <aditimedhane73 at gmail.com>
Date: Wed, 8 Jul 2026 08:30:44 +0000
Subject: [PATCH 2/2] [neat] fix error checks a/c to windows error format
---
.../explicit-specialization-after-instantiation-crash.cpp | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/clang/test/SemaCXX/explicit-specialization-after-instantiation-crash.cpp b/clang/test/SemaCXX/explicit-specialization-after-instantiation-crash.cpp
index 21a657b19822d..4ee2bfa61da45 100644
--- a/clang/test/SemaCXX/explicit-specialization-after-instantiation-crash.cpp
+++ b/clang/test/SemaCXX/explicit-specialization-after-instantiation-crash.cpp
@@ -35,6 +35,6 @@ int main() {
}
// Verify the assertion failure occurs
-// CHECK: RecordLayoutBuilder.cpp
-// CHECK: Assertion{{.*}}!D->isInvalidDecl()
-// CHECK: Cannot get layout of invalid decl
+// CHECK: Assertion
+// CHECK: isInvalidDecl
+// CHECK: Cannot get layout of invalid decl
\ No newline at end of file
More information about the cfe-commits
mailing list