1 // RUN: %clang_cc1 -fsyntax-only -verify %s
2 
3 template<typename T>
4 struct X {
5   int x;
6   T y; // expected-error{{data member instantiated with function type}}
7   T* z;
8   T bitfield : 12; // expected-error{{bit-field 'bitfield' has non-integral type 'float'}} \
9                   // expected-error{{data member instantiated with function type}}
10 
11   mutable T x2; // expected-error{{data member instantiated with function type}}
12 };
13 
test1(const X<int> * xi)14 void test1(const X<int> *xi) {
15   int i1 = xi->x;
16   const int &i2 = xi->y;
17   int* ip1 = xi->z;
18   int i3 = xi->bitfield;
19   xi->x2 = 17;
20 }
21 
test2(const X<float> * xf)22 void test2(const X<float> *xf) {
23   (void)xf->x; // expected-note{{in instantiation of template class 'X<float>' requested here}}
24 }
25 
test3(const X<int (int)> * xf)26 void test3(const X<int(int)> *xf) {
27   (void)xf->x; // expected-note{{in instantiation of template class 'X<int (int)>' requested here}}
28 }
29 
30 namespace PR7123 {
31   template <class > struct requirement_;
32 
33   template <void(*)()> struct instantiate
34   { };
35 
36   template <class > struct requirement ;
37   struct failed ;
38 
39   template <class Model> struct requirement<failed *Model::*>
40   {
failedPR7123::requirement41     static void failed()
42     {
43       ((Model*)0)->~Model(); // expected-note{{in instantiation of}}
44     }
45   };
46 
47   template <class Model> struct requirement_<void(*)(Model)> : requirement<failed *Model::*>
48   { };
49 
50   template <int> struct Requires_
51   { typedef void type; };
52 
53   template <class Model> struct usage_requirements
54   {
~usage_requirementsPR7123::usage_requirements55     ~usage_requirements()
56     {((Model*)0)->~Model(); } // expected-note{{in instantiation of}}
57   };
58 
59   template < typename TT > struct BidirectionalIterator
60   {
61     enum
62       { value = 0 };
63 
64     instantiate< requirement_<void(*)(usage_requirements<BidirectionalIterator>)>::failed> int534; // expected-note{{in instantiation of}}
65 
~BidirectionalIteratorPR7123::BidirectionalIterator66     ~BidirectionalIterator()
67     { i--; } // expected-error{{cannot decrement value of type 'PR7123::X'}}
68 
69     TT i;
70   };
71 
72   struct X
73   { };
74 
75   template<typename RanIter>
sort(RanIter,RanIter)76   typename Requires_< BidirectionalIterator<RanIter>::value >::type sort(RanIter,RanIter){}
77 
f()78   void f()
79   {
80     X x;
81     sort(x,x);
82   }
83 }
84 
85 namespace PR7355 {
86   template<typename T1> class A {
87     class D; // expected-note{{declared here}}
88     D d; //expected-error{{implicit instantiation of undefined member 'PR7355::A<int>::D'}}
89   };
90 
91   A<int> ai; // expected-note{{in instantiation of}}
92 }
93 
94 namespace PR8712 {
95   template <int dim>
96   class B {
97   public:
98     B(const unsigned char i);
99     unsigned char value : (dim > 0 ? dim : 1);
100   };
101 
102   template <int dim>
B(const unsigned char i)103   inline B<dim>::B(const unsigned char i) : value(i) {}
104 }
105