1 // RUN: %clang_cc1 -fsyntax-only -verify %s
2 template<template<typename T
> class MetaFun
, typename Value
>
4 typedef typename MetaFun
<Value
>::type type
;
13 struct add_reference
{
18 apply
<add_pointer
, int>::type ip
= &i
;
19 apply
<add_reference
, int>::type ir
= i
;
20 apply
<add_reference
, float>::type fr
= i
; // expected-error{{non-const lvalue reference to type 'float' cannot bind to a value of unrelated type 'int'}}
22 // Template template parameters
23 template<int> struct B
;
26 template<T Value
> class X
> // expected-error{{cannot have type 'float'}}
27 // expected-error@-1 {{cannot be narrowed from type 'long long' to 'int'}}
28 // expected-note@-2 {{previous template template parameter is here}}
32 X0
<float, B
> x0b2
; // expected-note{{while substituting}}
33 X0
<long long, B
> x0b3
; // expected-note {{has different template parameters}}
35 template<template<int V
> class TT
>
38 template<typename T
, template<T V
> class TT
>
43 template<int V
> struct X3i
{ };
44 template<long V
> struct X3l
{ };
47 X2
<long, X3l
> x2okay2
;
49 template <typename T
, template <T
, T
> class TT
, class R
= TT
<1, 2> >
52 template <T x
, T y
> struct gt
{
53 static const bool result
= x
> y
;
58 template <int x
, int y
> struct lt
{
59 static const bool result
= x
< y
;
65 template<template<int> class TT
> struct X0
69 template<int> struct Type
{ };
71 template<class T
> struct X1
73 template<class U
> struct Inner
;
75 template<class U
> void g()
77 typedef Inner
<U
> Init
;
78 X0
<Init::template VeryInner
>::apply();
80 template<int N
> void f ()
85 template<class T
> template<class U
> struct X1
<T
>::Inner
87 template<int> struct VeryInner
{