| // RUN: %clang_cc1 -fsyntax-only -verify %s |
| |
| // C++ [dcl.ref]p5: |
| // There shall be no references to references, no arrays of |
| // references, and no pointers to references. |
| |
| // The crazy formatting in here is to enforce the exact report locations. |
| |
| typedef int &intref; |
| typedef intref &intrefref; |
| |
| template <class T> class RefMem { // expected-warning{{class 'RefMem<int &>' does not declare any constructor to initialize its non-modifiable members}} |
| T |
| & |
| member; // expected-note{{reference member 'member' will never be initialized}} |
| }; |
| |
| struct RefRef { |
| int |
| & |
| & // expected-error {{declared as a reference to a reference}} |
| refref0; |
| |
| intref |
| & |
| refref1; // collapses |
| |
| intrefref |
| & |
| refref2; // collapses |
| |
| RefMem |
| < |
| int |
| & |
| > |
| refref3; // collapses expected-note{{in instantiation of template class 'RefMem<int &>' requested here}} |
| }; |
| |
| |
| template <class T> class PtrMem { |
| T |
| * // expected-error {{declared as a pointer to a reference}} |
| member; |
| }; |
| |
| struct RefPtr { |
| typedef |
| int |
| & |
| * // expected-error {{declared as a pointer to a reference}} |
| intrefptr; |
| |
| typedef |
| intref |
| * // expected-error {{declared as a pointer to a reference}} |
| intrefptr2; |
| |
| int |
| & |
| * // expected-error {{declared as a pointer to a reference}} |
| refptr0; |
| |
| intref |
| * // expected-error {{declared as a pointer to a reference}} |
| refptr1; |
| |
| PtrMem |
| < |
| int |
| & |
| > |
| refptr2; // expected-note {{in instantiation}} |
| }; |
| |
| template <class T> class ArrMem { |
| T |
| member |
| [ // expected-error {{declared as array of references}} |
| 10 |
| ]; |
| }; |
| template <class T, unsigned N> class DepArrMem { |
| T |
| member |
| [ // expected-error {{declared as array of references}} |
| N |
| ]; |
| }; |
| |
| struct RefArr { |
| typedef |
| int |
| & |
| intrefarr |
| [ // expected-error {{declared as array of references}} |
| 2 |
| ]; |
| |
| typedef |
| intref |
| intrefarr |
| [ // expected-error {{declared as array of references}} |
| 2 |
| ]; |
| |
| int |
| & |
| refarr0 |
| [ // expected-error {{declared as array of references}} |
| 2 |
| ]; |
| intref |
| refarr1 |
| [ // expected-error {{declared as array of references}} |
| 2 |
| ]; |
| ArrMem |
| < |
| int |
| & |
| > |
| refarr2; // expected-note {{in instantiation}} |
| DepArrMem |
| < |
| int |
| &, |
| 10 |
| > |
| refarr3; // expected-note {{in instantiation}} |
| }; |
| |
| |
| // The declaration of a reference shall contain an initializer |
| // (8.5.3) except when the declaration contains an explicit extern |
| // specifier (7.1.1), is a class member (9.2) declaration within a |
| // class definition, or is the declaration of a parameter or a |
| // return type (8.3.5); see 3.1. A reference shall be initialized to |
| // refer to a valid object or function. [ Note: in particular, a |
| // null reference cannot exist in a well-defined program, because |
| // the only way to create such a reference would be to bind it to |
| // the "object" obtained by dereferencing a null pointer, which |
| // causes undefined behavior. As described in 9.6, a reference |
| // cannot be bound directly to a bit-field. |
| |