summaryrefslogtreecommitdiffstats
path: root/test/CXX/temp/temp.param/p11-0x.cpp
blob: 0bf4341cf8d779f56bb673ea053af33f6f076718 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
// RUN: %clang_cc1 -std=c++0x -fsyntax-only -verify %s

// If a template-parameter of a class template has a default
// template-argument, each subsequent template-parameter shall either
// have a default template-argument supplied or be a template
// parameter pack.
template<typename> struct vector;

template<typename T = int, typename ...Types> struct X2t;
template<int V = 0, int ...Values> struct X2nt;
template<template<class> class M = vector, template<class> class... Metas>
  struct X2tt;

// If a template-parameter of a primary class template is a template
// parameter pack, it shall be the last template-parameter .
template<typename ...Types, // expected-error{{template parameter pack must be the last template parameter}}
         int After>
struct X0t;

template<int ...Values, // expected-error{{template parameter pack must be the last template parameter}}
         int After>
struct X0nt;

template<template<typename> class ...Templates, // expected-error{{template parameter pack must be the last template parameter}}
         int After>
struct X0tt;

// [ Note: These are not requirements for function templates or class
// template partial specializations because template arguments can be
// deduced (14.8.2). -- end note]
template<typename... Types> struct X1t;
template<typename ...Types, typename T> struct X1t<T, Types...> { };

template<int... Values> struct X1nt;
template<int ...Values, int V> struct X1nt<V, Values...> { };

template<template<int> class... Meta> struct X1tt;
template<template<int> class... Meta, template<int> class M> 
  struct X1tt<M, Meta...> { };

template<typename ...Types, typename T>
void f1t(X1t<T, Types...>);

template<int ...Values, int V>
void f1nt(X1nt<V, Values...>);

template<template<int> class... Meta, template<int> class M> 
void f1tt(X1tt<M, Meta...>);

namespace DefaultTemplateArgsInFunction {
  template<typename T = int, typename U>  T &f0(U) { T *x = 0; return *x; }

  void test_f0() {
    int &ir0 = f0(3.14159);
    int &ir1 = f0<int>(3.14159);
    float &fr0 = f0<float>(3.14159);
  }

  template<> int &f0(int*);
  template int &f0(double&);
}
OpenPOWER on IntegriCloud