[clang] [clang] Handle invalid template template arguments in partial ordering (PR #233138)
via cfe-commits
cfe-commits at lists.llvm.org
Sat Oct 17 15:16:53 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang
Author: Hrólf Kraki (Serosh-commits)
<details>
<summary>Changes</summary>
When an invalid template parameter list is encountered while partially ordering template template arguments, finishing deduction can produce `NonDeducedMismatch` so treating this as a failed match instead of asserting that the template-template parameter is invalid
Fixes #<!-- -->227649
---
Full diff: https://github.com/llvm/llvm-project/pull/233138.diff
2 Files Affected:
- (modified) clang/lib/Sema/SemaTemplateDeduction.cpp (+2-4)
- (added) clang/test/SemaTemplate/gh227649.cpp (+6)
``````````diff
diff --git a/clang/lib/Sema/SemaTemplateDeduction.cpp b/clang/lib/Sema/SemaTemplateDeduction.cpp
index 1544fd56b82ae2..651114329d4e9e 100644
--- a/clang/lib/Sema/SemaTemplateDeduction.cpp
+++ b/clang/lib/Sema/SemaTemplateDeduction.cpp
@@ -6609,11 +6609,9 @@ bool Sema::isTemplateTemplateParameterAtLeastAsSpecializedAs(
case TemplateDeductionResult::Success:
return true;
- // It doesn't seem possible to get a non-deduced mismatch when partial
- // ordering TTPs, except with an invalid template parameter list which has
- // a parameter after a pack.
+ // An invalid template parameter list can produce a non-deduced mismatch
+ // while finishing the deduction.
case TemplateDeductionResult::NonDeducedMismatch:
- assert(PArg->isInvalidDecl() && "Unexpected NonDeducedMismatch");
return false;
// Substitution failures should have already been diagnosed.
diff --git a/clang/test/SemaTemplate/gh227649.cpp b/clang/test/SemaTemplate/gh227649.cpp
new file mode 100644
index 00000000000000..02784971cb6907
--- /dev/null
+++ b/clang/test/SemaTemplate/gh227649.cpp
@@ -0,0 +1,6 @@
+// RUN: %clang_cc1 -fsyntax-only %s 2>&1 | FileCheck %s
+// CHECK: error: use of undeclared identifier 'foo'
+
+template <template <decltype(foo())> typename> struct S {};
+template <int &p> struct P;
+S<P> s;
``````````
</details>
https://github.com/llvm/llvm-project/pull/233138
More information about the cfe-commits
mailing list