File: p16.cpp

package info (click to toggle)
llvm-toolchain-19 1%3A19.1.7-3~deb12u1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 1,998,492 kB
  • sloc: cpp: 6,951,680; ansic: 1,486,157; asm: 913,598; python: 232,024; f90: 80,126; objc: 75,281; lisp: 37,276; pascal: 16,990; sh: 10,009; ml: 5,058; perl: 4,724; awk: 3,523; makefile: 3,167; javascript: 2,504; xml: 892; fortran: 664; cs: 573
file content (132 lines) | stat: -rw-r--r-- 3,538 bytes parent folder | download | duplicates (10)
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
// RUN: %clang_cc1 -fsyntax-only -pedantic-errors -verify %s
template<class T> struct A { 
  void f(T);
  template<class X1> void g1(T, X1); 
  template<class X2> void g2(T, X2); 
  void h(T) { }
};

// specialization 
template<> void A<int>::f(int);

// out of class member template definition 
template<class T> template<class X1> void A<T>::g1(T, X1) { }

// member template specialization 
template<> template<class X1> void A<int>::g1(int, X1);

// member template specialization 
template<> template<>
  void A<int>::g1(int, char);	// X1 deduced as char 

template<> template<>
  void A<int>::g2<char>(int, char); // X2 specified as char 
                                    // member specialization even if defined in class definition

template<> void A<int>::h(int) { }

namespace PR10024 {
  template <typename T> 
  struct Test{ 
    template <typename U> 
    void get(U i) {}
  }; 

  template <typename T>
  template <>
  void Test<T>::get<double>(double i) {}  // expected-error{{cannot specialize (with 'template<>') a member of an unspecialized template}}
}

namespace extraneous {
  template<typename T> struct A;

  template<typename T> int x;

  template<typename T> void f();

  template<> // expected-error{{extraneous template parameter list in template specialization}}
  template<>
  struct A<int>;

  template<> // expected-error{{extraneous template parameter list in template specialization}}
  template<>
  int x<int>;

  template<> // expected-error{{extraneous template parameter list in template specialization}}
  template<>
  void f<int>();

  template<typename T>
  struct B {
    struct C;

    template<typename U>
    struct D;

    static int y;

    template<typename U>
    static int z;

    void g();

    template<typename U>
    void h();

    enum class E;

    enum F : int;
  };

  template<>
  template<> // expected-error{{extraneous 'template<>' in declaration of struct 'C'}}
  struct B<int>::C;

  template<>
  template<> // expected-error{{extraneous template parameter list in template specialization}}
  template<>
  struct B<int>::D<int>;

  template<>
  template<> // expected-error{{extraneous template parameter list in template specialization}}
  template<typename U>
  struct B<int>::D;

  template<>
  template<> // expected-error{{extraneous 'template<>' in declaration of variable 'y'}}
  int B<int>::y;

  template<>
  template<> // expected-error{{extraneous template parameter list in template specialization}}
  template<>
  int B<int>::z<int>;

  template<>
  template<> // expected-error{{extraneous template parameter list in template specialization}}
  template<typename U>
  int B<int>::z;

  template<>
  template<>
  void B<int>::g(); // expected-error{{no function template matches function template specialization 'g'}}

  template<>
  template<> // expected-error{{extraneous template parameter list in template specialization}}
  template<>
  void B<int>::h<int>();

  template<>
  template<> // expected-error{{extraneous template parameter list in template specialization}}
  template<typename U>
  void B<int>::h<int>(); // expected-error{{function template partial specialization is not allowed}}

  // FIXME: We should diagnose this as having an extraneous 'template<>'
  template<>
  template<>
  enum class B<int>::E; // expected-error{{enumeration cannot be a template}}

  // FIXME: We should diagnose this as having an extraneous 'template<>'
  template<>
  template<>
  enum B<int>::F : int; // expected-error{{enumeration cannot be a template}}
}