Mercurial > hg > CbC > CbC_llvm
view clang/test/SemaTemplate/cxx2a-constraint-exprs.cpp @ 266:00f31e85ec16 default tip
Added tag current for changeset 31d058e83c98
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Sat, 14 Oct 2023 10:13:55 +0900 |
parents | c4bab56944e8 |
children |
line wrap: on
line source
// RUN: %clang_cc1 -std=c++2a -verify %s // Make sure constraint expressions are unevaluated before being substituted // into during satisfaction checking. template<typename T> constexpr bool f = T::value; // expected-error@-1 4{{type}} namespace unevaluated { template<typename T> concept Foo = false && f<int>; bool k = Foo<int>; template<typename T> requires false && f<int> struct S {}; // expected-note@-1{{because}} using s = S<int>; // expected-error {{constraints not satisfied}} template<typename T> void foo() requires false && f<int> { }; // expected-note@-1{{because}} expected-note@-1{{candidate template ignored}} int a = (foo<int>(), 0); // expected-error{{no matching function}} template<typename T> void bar() requires requires { requires false && f<int>; } { }; // expected-note@-1{{because}} expected-note@-1{{candidate template ignored}} int b = (bar<int>(), 0); // expected-error{{no matching function}} template<typename T> struct M { static void foo() requires false && f<int> { }; }; // expected-note@-1{{because}} int c = (M<int>::foo(), 0); // expected-error@-1{{invalid reference to function 'foo': constraints not satisfied}} } namespace constant_evaluated { template<typename T> requires f<int[0]> struct S {}; // expected-note@-1{{in instantiation of}} expected-note@-1{{while substituting}} using s = S<int>; // expected-note@-1 {{while checking}} template<typename T> void foo() requires f<int[1]> { }; // expected-note@-1{{in instantiation}} expected-note@-1{{while substituting}} \ expected-note@-1{{candidate template ignored}} int a = (foo<int>(), 0); // expected-note@-1 {{while checking}} expected-error@-1{{no matching function}} \ expected-note@-1 {{in instantiation}} template<typename T> void bar() requires requires { requires f<int[2]>; } { }; // expected-note@-1{{in instantiation}} \ expected-note@-1{{while substituting}} \ expected-note@-1 {{while checking the satisfaction of nested requirement}} int b = (bar<int>(), 0); template<typename T> struct M { static void foo() requires f<int[3]> { }; }; // expected-note@-1{{in instantiation}} expected-note@-1{{while substituting}} int c = (M<int>::foo(), 0); // expected-note@-1 {{while checking}} }