2013-06-10 14:50:24 +08:00
// RUN: %clang_cc1 -std=c++11 -verify -fsyntax-only %s
// RUN: %clang_cc1 -std=c++1y %s -verify -DCXX1Y
// Explicit member declarations behave as in C++11.
namespace n3323_example {
template < class T > class zero_init {
public :
zero_init ( ) : val ( static_cast < T > ( 0 ) ) { }
zero_init ( T val ) : val ( val ) { }
operator T & ( ) { return val ; } //@13
operator T ( ) const { return val ; } //@14
private :
T val ;
} ;
void Delete ( ) {
zero_init < int * > p ;
p = new int ( 7 ) ;
delete p ; //@23
delete ( p + 0 ) ;
delete + p ;
}
void Switch ( ) {
zero_init < int > i ;
i = 7 ;
switch ( i ) { } // @31
switch ( i + 0 ) { }
switch ( + i ) { }
}
}
# ifdef CXX1Y
# else
//expected-error@23 {{ambiguous conversion of delete expression of type 'zero_init<int *>' to a pointer}}
//expected-note@13 {{conversion to pointer type 'int *'}}
//expected-note@14 {{conversion to pointer type 'int *'}}
//expected-error@31 {{multiple conversions from switch condition type 'zero_init<int>' to an integral or enumeration type}}
//expected-note@13 {{conversion to integral type 'int'}}
//expected-note@14 {{conversion to integral type 'int'}}
# endif
namespace extended_examples {
struct A0 {
operator int ( ) ; // matching and viable
} ;
struct A1 {
operator int ( ) & & ; // matching and not viable
} ;
struct A2 {
operator float ( ) ; // not matching
} ;
struct A3 {
template < typename T > operator T ( ) ; // not matching (ambiguous anyway)
} ;
struct A4 {
template < typename T > operator int ( ) ; // not matching (ambiguous anyway)
} ;
struct B1 {
operator int ( ) & & ; // @70
operator int ( ) ; // @71 -- duplicate declaration with different qualifier is not allowed
} ;
struct B2 {
operator int ( ) & & ; // matching but not viable
operator float ( ) ; // not matching
} ;
void foo ( A0 a0 , A1 a1 , A2 a2 , A3 a3 , A4 a4 , B2 b2 ) {
switch ( a0 ) { }
switch ( a1 ) { } // @81 -- fails for different reasons
switch ( a2 ) { } // @82
switch ( a3 ) { } // @83
switch ( a4 ) { } // @84
switch ( b2 ) { } // @85 -- fails for different reasons
}
}
//expected-error@71 {{cannot overload a member function without a ref-qualifier with a member function with ref-qualifier '&&'}}
//expected-note@70 {{previous declaration is here}}
//expected-error@82 {{statement requires expression of integer type ('extended_examples::A2' invalid)}}
//expected-error@83 {{statement requires expression of integer type ('extended_examples::A3' invalid)}}
//expected-error@84 {{statement requires expression of integer type ('extended_examples::A4' invalid)}}
# ifdef CXX1Y
//expected-error@81 {{statement requires expression of integer type ('extended_examples::A1' invalid)}}
//expected-error@85 {{statement requires expression of integer type ('extended_examples::B2' invalid)}}
# else
2018-01-01 02:27:29 +08:00
//expected-error@81 {{'this' argument to member function 'operator int' is an lvalue, but function has rvalue ref-qualifier}} expected-note@54 {{'operator int' declared here}}
//expected-error@85 {{'this' argument to member function 'operator int' is an lvalue, but function has rvalue ref-qualifier}} expected-note@75 {{'operator int' declared here}}
2013-06-10 14:50:24 +08:00
# endif
namespace extended_examples_cxx1y {
struct A1 { // leads to viable match in C++1y, and no viable match in C++11
operator int ( ) & & ; // matching but not viable
template < typename T > operator T ( ) ; // In C++1y: matching and viable, since disambiguated by L.100
} ;
struct A2 { // leads to ambiguity in C++1y, and no viable match in C++11
operator int ( ) & & ; // matching but not viable
template < typename T > operator int ( ) ; // In C++1y: matching but ambiguous (disambiguated by L.105).
} ;
struct B1 { // leads to one viable match in both cases
operator int ( ) ; // matching and viable
template < typename T > operator T ( ) ; // In C++1y: matching and viable, since disambiguated by L.110
} ;
struct B2 { // leads to one viable match in both cases
operator int ( ) ; // matching and viable
template < typename T > operator int ( ) ; // In C++1y: matching but ambiguous, since disambiguated by L.115
} ;
struct C { // leads to no match in both cases
operator float ( ) ; // not matching
template < typename T > operator T ( ) ; // In C++1y: not matching, nor viable.
} ;
struct D { // leads to viable match in C++1y, and no viable match in C++11
operator int ( ) & & ; // matching but not viable
operator float ( ) ; // not matching
template < typename T > operator T ( ) ; // In C++1y: matching and viable, since disambiguated by L.125
} ;
void foo ( A1 a1 , A2 a2 , B1 b1 , B2 b2 , C c , D d ) {
switch ( a1 ) { } // @138 -- should presumably call templated conversion operator to convert to int.
switch ( a2 ) { } // @139
switch ( b1 ) { }
switch ( b2 ) { }
switch ( c ) { } // @142
switch ( d ) { } // @143
}
}
//expected-error@142 {{statement requires expression of integer type ('extended_examples_cxx1y::C' invalid)}}
# ifdef CXX1Y
//expected-error@139 {{statement requires expression of integer type ('extended_examples_cxx1y::A2' invalid)}}
# else
2018-01-01 02:27:29 +08:00
//expected-error@138 {{'this' argument to member function 'operator int' is an lvalue, but function has rvalue ref-qualifier}} expected-note@106 {{'operator int' declared here}}
//expected-error@139 {{'this' argument to member function 'operator int' is an lvalue, but function has rvalue ref-qualifier}} expected-note@111 {{'operator int' declared here}}
//expected-error@143 {{'this' argument to member function 'operator int' is an lvalue, but function has rvalue ref-qualifier}} expected-note@131 {{'operator int' declared here}}
2013-06-10 14:50:24 +08:00
# endif
2013-06-18 09:27:47 +08:00
namespace extended_examples_array_bounds {
typedef decltype ( sizeof ( int ) ) size_t ;
struct Foo {
operator size_t ( ) ; // @162
operator unsigned short ( ) ; // @163
} ;
void bar ( ) {
Foo x ;
int * p = new int [ x ] ; // @168
}
}
# ifdef CXX1Y
# else
//expected-error@168 {{ambiguous conversion of array size expression of type 'extended_examples_array_bounds::Foo' to an integral or enumeration type}}
2017-03-10 23:04:58 +08:00
//expected-note@162 {{conversion to integral type 'extended_examples_array_bounds::size_t'}}
2013-06-18 09:27:47 +08:00
//expected-note@163 {{conversion to integral type 'unsigned short' declared here}}
# endif