[clang] [NFC][Clang] Pre-commit test for assertion failure in template specialization error recovery (PR #208151)
via cfe-commits
cfe-commits at lists.llvm.org
Thu Jul 9 00:07:27 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang
Author: Aditi Medhane (AditiRM)
<details>
<summary>Changes</summary>
Pre-commit test documenting the current crash behaviour when handling explicit template specialization after instantiation.
The compiler currently crashes with an assertion failure in `getASTRecordLayout()` when attempting to get layout information for an invalid declaration during error recovery. This test documents this behavior before the fix.
---
Full diff: https://github.com/llvm/llvm-project/pull/208151.diff
1 Files Affected:
- (added) clang/test/SemaCXX/explicit-specialization-after-instantiation-crash.cpp (+40)
``````````diff
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..9120fa45330b8
--- /dev/null
+++ b/clang/test/SemaCXX/explicit-specialization-after-instantiation-crash.cpp
@@ -0,0 +1,40 @@
+// Test that explicit template specialization after instantiation
+// is handled gracefully without assertion failure.
+//
+// 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: Assertion
+// CHECK: isInvalidDecl
+// CHECK: Cannot get layout of invalid decl
\ No newline at end of file
``````````
</details>
https://github.com/llvm/llvm-project/pull/208151
More information about the cfe-commits
mailing list