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'}}
30 X0
<float, B
> x0b2
; // expected-note{{while substituting}}
33 template<template<int V
> class TT
>
36 template<typename T
, template<T V
> class TT
>
41 template<int V
> struct X3i
{ };
42 template<long V
> struct X3l
{ };
45 X2
<long, X3l
> x2okay2
;
47 template <typename T
, template <T
, T
> class TT
, class R
= TT
<1, 2> >
50 template <T x
, T y
> struct gt
{
51 static const bool result
= x
> y
;
56 template <int x
, int y
> struct lt
{
57 static const bool result
= x
< y
;
63 template<template<int> class TT
> struct X0
67 template<int> struct Type
{ };
69 template<class T
> struct X1
71 template<class U
> struct Inner
;
73 template<class U
> void g()
75 typedef Inner
<U
> Init
;
76 X0
<Init::template VeryInner
>::apply();
78 template<int N
> void f ()
83 template<class T
> template<class U
> struct X1
<T
>::Inner
85 template<int> struct VeryInner
{