Home | History | Annotate | Download | only in dcl.ref
      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 
      9 typedef int &intref;
     10 typedef intref &intrefref;
     11 
     12 template <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 
     18 struct 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 
     41 template <class T> class PtrMem {
     42   T
     43     *                   // expected-error {{declared as a pointer to a reference}}
     44       member;
     45 };
     46 
     47 struct 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 
     76 template <class T> class ArrMem {
     77   T
     78     member
     79            [ // expected-error {{declared as array of references}}
     80             10
     81               ];
     82 };
     83 template <class T, unsigned N> class DepArrMem {
     84   T
     85     member
     86            [ // expected-error {{declared as array of references}}
     87             N
     88              ];
     89 };
     90 
     91 struct 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