https://github.com/erichkeane created https://github.com/llvm/llvm-project/pull/209893
At best this would cause cascading errors, but the example given in the bug report shows a case where we are breaking an assumed invariant due to the invalid NTTP. This patch just skips early and treats these as non-matching if either is invalid. Fixes: #208658 >From 50436e2565d8434ee17c56463fe67b0accd7c9e4 Mon Sep 17 00:00:00 2001 From: erichkeane <[email protected]> Date: Wed, 15 Jul 2026 13:28:41 -0700 Subject: [PATCH] Skip out on checking NTTP equivilents when one is invalid At best this would cause cascading errors, but the example given in the bug report shows a case where we are breaking an assumed invariant due to the invalid NTTP. This patch just skips early and treats these as non-matching if either is invalid. Fixes: #208658 --- clang/docs/ReleaseNotes.md | 2 ++ clang/lib/Sema/SemaTemplate.cpp | 7 +++++++ clang/test/CXX/temp/temp.param/p10-2a.cpp | 7 +++++++ 3 files changed, 16 insertions(+) diff --git a/clang/docs/ReleaseNotes.md b/clang/docs/ReleaseNotes.md index 07e9d4a554dd1..8f8cbf0342560 100644 --- a/clang/docs/ReleaseNotes.md +++ b/clang/docs/ReleaseNotes.md @@ -145,6 +145,8 @@ latest release, please see the [Clang Web Site](https://clang.llvm.org) or the #### Bug Fixes to C++ Support +-Fixed an issue where we tried to compare invalid NTTPs for variable declarations, which ended up in hitting an assertion with a constrained non-plain-auto NTTP, which we don't quite implement yet. (#GH208658) + #### Bug Fixes to AST Handling - Fixed a non-deterministic ordering of unused local typedefs that made diff --git a/clang/lib/Sema/SemaTemplate.cpp b/clang/lib/Sema/SemaTemplate.cpp index 7286a0c2f6fbf..8a778df4a794f 100644 --- a/clang/lib/Sema/SemaTemplate.cpp +++ b/clang/lib/Sema/SemaTemplate.cpp @@ -8281,6 +8281,13 @@ static bool MatchTemplateParameterKind( if (Kind != Sema::TPL_TemplateTemplateParmMatch || (!OldNTTP->getType()->isDependentType() && !NewNTTP->getType()->isDependentType())) { + + // Matching against an invalid declaration is going to be rife with + // errors, particularly when `getUnconstrainedType` isn't really valid + // there. Just treat these as otherwise invalid. + if (OldNTTP->isInvalidDecl() || NewNTTP->isInvalidDecl()) + return false; + // C++20 [temp.over.link]p6: // Two [non-type] template-parameters are equivalent [if] they have // equivalent types ignoring the use of type-constraints for diff --git a/clang/test/CXX/temp/temp.param/p10-2a.cpp b/clang/test/CXX/temp/temp.param/p10-2a.cpp index c0406f88db5f3..c915afd97aee9 100644 --- a/clang/test/CXX/temp/temp.param/p10-2a.cpp +++ b/clang/test/CXX/temp/temp.param/p10-2a.cpp @@ -141,3 +141,10 @@ using j2 = J<'a', nullptr>; template<OneOf<char, int> auto &x> // expected-error@-1 {{constrained placeholder types other than simple 'auto' on non-type template parameters not supported yet}} using K = int; + +namespace GH208658 { +template <class> concept C = true; +template <auto &x> using A = int; +template <C auto &x> using A = int; +// expected-error@-1 {{constrained placeholder types other than simple 'auto' on non-type template parameters not supported yet}} +} _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
