xref: /llvm-project/clang/test/Modules/concept_serialization.cpp (revision babdef27c503c0bbbcc017e9f88affddda90ea4e)
1*babdef27SErich Keane // RUN: rm -rf %t
2*babdef27SErich Keane // RUN: %clang_cc1 -std=c++20 -fmodules-cache-path=%t -x c++ %s -verify
3*babdef27SErich Keane // expected-no-diagnostics
4*babdef27SErich Keane #pragma clang module build std
5*babdef27SErich Keane module std [system] { module concepts [system] {} }
6*babdef27SErich Keane #pragma clang module contents
7*babdef27SErich Keane 
8*babdef27SErich Keane #pragma clang module begin std.concepts
9*babdef27SErich Keane template <class T>
10*babdef27SErich Keane T declval();
11*babdef27SErich Keane template<class T, class U>
12*babdef27SErich Keane concept common_reference_with = T::val;
13*babdef27SErich Keane template<class T>
14*babdef27SErich Keane concept input_or_output_iterator = true;
15*babdef27SErich Keane template <class T>
16*babdef27SErich Keane concept input_iterator = input_or_output_iterator<T> &&
17*babdef27SErich Keane                          common_reference_with<decltype(declval<T&>)&&, T&>;
18*babdef27SErich Keane #pragma clang module end /*std.concepts*/
19*babdef27SErich Keane #pragma clang module endbuild /*std*/
20*babdef27SErich Keane 
21*babdef27SErich Keane #pragma clang module import std.concepts
22*babdef27SErich Keane template<input_or_output_iterator>
23*babdef27SErich Keane struct iter_value_or_void{};
24*babdef27SErich Keane // ensure that we don't assert on a subsumption check due to improper
25*babdef27SErich Keane // deserialization.
26*babdef27SErich Keane template<input_iterator I>
27*babdef27SErich Keane struct iter_value_or_void<I>{};
28