[clang] [Clang][NFC] Add a regression test for #197067 (PR #197634)
Corentin Jabot via cfe-commits
cfe-commits at lists.llvm.org
Thu May 14 01:19:40 PDT 2026
https://github.com/cor3ntin created https://github.com/llvm/llvm-project/pull/197634
Because concepts were checked for satisfaction in the wrong contexts, we ended up creating deduction guides in the wrong contexts.
Fixes #197067
>From 9c635fa80b0f20a105c3693a1e02e2bbfd743e75 Mon Sep 17 00:00:00 2001
From: Corentin Jabot <corentinjabot at gmail.com>
Date: Thu, 14 May 2026 10:17:07 +0200
Subject: [PATCH] [Clang][NFC] Add a regression test for #197067
Because concepts were checked for satisfaction in the wrong contexts,
we ended up creating deduction guides in the wrong contexts.
Fixes #197067
---
clang/docs/ReleaseNotes.rst | 2 +-
clang/test/SemaTemplate/concepts.cpp | 32 ++++++++++++++++++++++++++++
2 files changed, 33 insertions(+), 1 deletion(-)
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index b49286b35c6b0..3c9baf25c8028 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -576,7 +576,7 @@ Bug Fixes to C++ Support
- Fixed a crash on error recovery when dealing with invalid templates. (#GH183075)
- Fixed a crash when instantiating ``requires`` expressions involving substitution failures in C++ concepts. (#GH176402)
- Concepts appearing in the require-clause of a member function no longer have access to non-public members of that class,
- or to a current class object. (#GH115838) (#GH194803)
+ or to a current class object. (#GH115838) (#GH194803) (#GH197067)
- We no longer caches invalid variable specializations. (#GH132592)
- Fixed an incorrect template argument deduction when matching packs of template
template parameters when one of its parameters is also a pack. (#GH181166)
diff --git a/clang/test/SemaTemplate/concepts.cpp b/clang/test/SemaTemplate/concepts.cpp
index 72a2fab99c581..86d6c4483cb73 100644
--- a/clang/test/SemaTemplate/concepts.cpp
+++ b/clang/test/SemaTemplate/concepts.cpp
@@ -1947,3 +1947,35 @@ static_assert(D<Publ>::has, "Public should be visible.");
static_assert(!D<Priv>::has, "Private should be invisible.");
static_assert(!D<Prot>::has, "Protected should be invisible.");
}
+
+
+namespace GH197067 {
+typedef int uint32_t;
+class basic_string;
+using string = basic_string;
+using __self_view = int;
+struct basic_string {
+ basic_string(const char *);
+ operator __self_view();
+};
+int GetVmo(int);
+template <typename> struct StorageTraits;
+template <class Traits, typename Storage>
+concept StorageTraitsBufferedReadApi =
+ requires(Storage storage_ref, uint32_t length) {
+ Traits::Read(storage_ref, length, length, [] {});
+ };
+template <class Traits, typename Storage>
+concept StorageTraitsApi = StorageTraitsBufferedReadApi<Traits, Storage>;
+template <typename T>
+concept StorageApi = StorageTraitsApi<StorageTraits<T>, T>;
+template <StorageApi Storage> struct View {
+ using storage_type = Storage;
+ storage_type storage_;
+};
+template <> struct StorageTraits<int> {
+ template <typename Callback>
+ static auto Read(int, long, uint32_t, Callback) {}
+};
+View zbi(GetVmo(string("")));
+}
More information about the cfe-commits
mailing list