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