1// RUN: %clang_cc1 -fsyntax-only -verify %s
2
3// C++ [dcl.ref]p5:
4//   There shall be no references to references, no arrays of
5//   references, and no pointers to references.
6
7// The crazy formatting in here is to enforce the exact report locations.
8
9typedef int &intref;
10typedef intref &intrefref;
11
12template <class T> class RefMem { // expected-warning{{class 'RefMem<int &>' does not declare any constructor to initialize its non-modifiable members}}
13  T
14    &
15      member; // expected-note{{reference member 'member' will never be initialized}}
16};
17
18struct RefRef {
19  int
20      &
21        &             // expected-error {{declared as a reference to a reference}}
22          refref0;
23
24  intref
25         &
26           refref1; // collapses
27
28  intrefref
29            &
30              refref2; // collapses
31
32  RefMem
33        <
34         int
35            &
36             >
37               refref3; // collapses expected-note{{in instantiation of template class 'RefMem<int &>' requested here}}
38};
39
40
41template <class T> class PtrMem {
42  T
43    *                   // expected-error {{declared as a pointer to a reference}}
44      member;
45};
46
47struct RefPtr {
48  typedef
49          int
50              &
51                *       // expected-error {{declared as a pointer to a reference}}
52                  intrefptr;
53
54  typedef
55          intref
56                 *      // expected-error {{declared as a pointer to a reference}}
57                   intrefptr2;
58
59  int
60      &
61        *               // expected-error {{declared as a pointer to a reference}}
62          refptr0;
63
64  intref
65         *              // expected-error {{declared as a pointer to a reference}}
66           refptr1;
67
68  PtrMem
69        <
70         int
71            &
72             >
73               refptr2; // expected-note {{in instantiation}}
74};
75
76template <class T> class ArrMem {
77  T
78    member
79           [ // expected-error {{declared as array of references}}
80            10
81              ];
82};
83template <class T, unsigned N> class DepArrMem {
84  T
85    member
86           [ // expected-error {{declared as array of references}}
87            N
88             ];
89};
90
91struct RefArr {
92  typedef
93          int
94              &
95                intrefarr
96                         [ // expected-error {{declared as array of references}}
97                          2
98                           ];
99
100  typedef
101          intref
102                 intrefarr
103                          [ // expected-error {{declared as array of references}}
104                           2
105                            ];
106
107  int
108      &
109        refarr0
110               [ // expected-error {{declared as array of references}}
111                2
112                 ];
113  intref
114         refarr1
115                [ // expected-error {{declared as array of references}}
116                 2
117                  ];
118  ArrMem
119        <
120         int
121            &
122             >
123               refarr2; // expected-note {{in instantiation}}
124  DepArrMem
125           <
126            int
127               &,
128                  10
129                    >
130                      refarr3; // expected-note {{in instantiation}}
131};
132
133
134//   The declaration of a reference shall contain an initializer
135//   (8.5.3) except when the declaration contains an explicit extern
136//   specifier (7.1.1), is a class member (9.2) declaration within a
137//   class definition, or is the declaration of a parameter or a
138//   return type (8.3.5); see 3.1. A reference shall be initialized to
139//   refer to a valid object or function. [ Note: in particular, a
140//   null reference cannot exist in a well-defined program, because
141//   the only way to create such a reference would be to bind it to
142//   the "object" obtained by dereferencing a null pointer, which
143//   causes undefined behavior. As described in 9.6, a reference
144//   cannot be bound directly to a bit-field.
145
146