146 lines
3.7 KiB
C++
146 lines
3.7 KiB
C++
|
// 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.
|
||
|
|