Mercurial > hg > CbC > CbC_gcc
view gcc/testsuite/g++.dg/cpp2a/concepts-p1141.C @ 145:1830386684a0
gcc-9.2.0
author | anatofuz |
---|---|
date | Thu, 13 Feb 2020 11:34:05 +0900 |
parents | |
children |
line wrap: on
line source
// { dg-do compile } // { dg-options "-std=c++2a" } template<typename T> concept Type = true; template<typename T> concept Bottom = false; template<typename T> concept Class = __is_class(T); template<auto N> concept Number = true; template<template<typename> class T> concept Template = true; struct empty { }; Type x1 = 0; // { dg-error "expected 'auto'" } Type auto x2 = 0; Number x3 = 0; // { dg-error "does not constrain a type" } Template x4 = 0; // { dg-error "does not constrain a type" } Type const& x5 = 0; // { dg-error "expected 'auto'" } const Type& x6 = 0; // { dg-error "expected 'auto'" } Type auto const& x7 = 0; const Type auto& x8 = 0; Type const auto& x9 = 0; // { dg-error "expected 'auto'|two or more data types" } template<Type T> // OK: T is a type parameter. void f1(T); template<Number N> // { dg-error "does not constrain a type" } void f2(); template<Template X> // { dg-error "does not constrain a type" } void f3(); template<Type auto N> // OK: N is a non-type parameter. void f4() { } template<Bottom auto N> // OK: but never usable. void f5(); void driver() { f4<0>(); f5<0>(); // { dg-error "no matching function for call | constraints not satisfied" } } Type f6() { return 0; } // { dg-error "expected 'auto'" } static_assert(__is_same_as(decltype(f6), int())); Type auto f7() { return 0; } static_assert(__is_same_as(decltype(f7), int())); Type f8() { return 0; } // { dg-error "expected 'auto'" } auto f9() -> Type { return 0; } // { dg-error "expected 'auto'" } Type f10() { } // { dg-error "expected 'auto'" } auto f11() -> Type { } // { dg-error "expected" } Number f12(); // { dg-error "does not constrain a type" } auto f13() -> Number; // { dg-error "does not constrain a type" } Template f14(); // { dg-error "does not constrain a type" } auto f15() -> Template; // { dg-error "does not constrain a type" } Type f16() { return 0; } // { dg-error "expected 'auto'" } auto f17() -> Type { return 0; } // { dg-error "expected 'auto'" } // Abbreviated function templates void f18(Class x) { } // { dg-error "expected 'auto'" } void f19(Class auto x) { } void f20(Class auto x, Class auto y) { } void driver_1() { f19(0); // { dg-error "" } f19(empty{}); f20(0, empty{}); // { dg-error "" } f20(empty{}, empty{}); } // Abbreviated function redeclarations // Functionally equivalent but not equivalent. void f21(Class auto x); template<Class T> void f21(T x); void driver_2() { f21(empty{}); // { dg-error "call of overload | ambiguous" } }