1 // { dg-options "-std=c++17 -fconcepts" } 2 3 template<typename T> C()4 concept bool C() { return __is_class(T); } 5 6 template<int N> Int()7 concept bool Int() { return true; } 8 9 template<template<typename> class X> Template()10 concept bool Template() { return true; } 11 12 struct S { }; 13 f1(Int)14void f1(Int) { } // { dg-error "" } f2(Template)15void f2(Template) { } // { dg-error "" } 16 17 struct S1 { f1S118 void f1(auto x) { } f2S119 void f2(C x) { } 20 f3S121 void f3(auto x) { } f3S122 void f3(C x) { } 23 }; 24 25 template<C T> 26 struct S2 { f1S227 void f1(auto x) { } f2S228 void f2(C x) { } 29 30 void h1(auto x); 31 void h2(C x); 32 33 template<C U> gS234 void g(T t, U u) { } 35 }; 36 main()37int main() { 38 S s; 39 40 S1 s1; 41 s1.f2(0); // { dg-error "matching" } 42 43 S2<S> s2; 44 s2.f2(0); // { dg-error "matching" } 45 s2.h2(0); // { dg-error "matching" } 46 47 s2.g(s, 0); // { dg-error "matching" } 48 s2.g(0, s); // { dg-error "matching" } 49 } 50