| // RUN: %clang_cc1 -std=c++2c -verify %s | |
| template<template<typename> auto Var> | |
| struct A{}; | |
| template<template<auto> auto Var> | |
| struct B{}; | |
| template<template<typename> auto Var> | |
| struct C{}; | |
| template<template<typename> concept C> | |
| struct D{}; | |
| template<template<auto> concept C> | |
| struct E{}; | |
| template<template<typename> auto Var> | |
| int V1; | |
| template<template<auto> auto Var> | |
| int V2; | |
| template<template<typename> auto Var> | |
| int V3; | |
| template<template<typename> concept C> | |
| int V4; | |
| template<template<auto> concept C> | |
| int V5; | |
| namespace packs { | |
| template<template<typename> auto... Var> | |
| struct A{}; | |
| template<template<auto> auto... Var> | |
| struct B{}; | |
| template<template<typename> auto... Var> | |
| struct C{}; | |
| template<template<typename> concept... C> | |
| struct D{}; | |
| template<template<auto> concept... C> | |
| struct E{}; | |
| template<template<typename> auto... Var> | |
| int V1; | |
| template<template<auto> auto... Var> | |
| int V2; | |
| template<template<typename> auto... Var> | |
| int V3; | |
| template<template<typename> concept... C> | |
| int V4; | |
| template<template<auto> concept... C> | |
| int V5; | |
| } | |
| namespace concepts { | |
| template<template<auto> concept...> | |
| struct A{}; | |
| template<template<auto> concept... C> | |
| struct B{}; | |
| template<template<auto> concept& C> // expected-error{{expected identifier}} \ | |
| // expected-error {{in declaration of struct 'C'}} | |
| struct C{}; | |
| } | |
| namespace vars { | |
| template<template<auto> auto...> | |
| struct A{}; | |
| template<template<auto> auto & C> // expected-error {{expected identifier}} \ | |
| // expected-error {{extraneous 'template<>'}} | |
| struct B{}; | |
| template<template<auto> const auto> // expected-error {{expected identifier}} \ | |
| // expected-error {{extraneous 'template<>'}} | |
| struct C{}; | |
| } | |
| namespace errors { | |
| template<concept> // expected-error {{expected template parameter}} \ | |
| // expected-error {{extraneous 'template<>' in declaration of struct 'A'}} | |
| struct A{}; | |
| template<template<concept> auto> // expected-error {{expected template parameter}} \ | |
| // expected-error {{template template parameter must have its own template parameters}} | |
| struct B{}; | |
| } |