2017-12-09 20:09:54 +08:00
// RUN: %clang_cc1 -fsyntax-only -pedantic -verify -std=gnu++98 %s
2015-11-12 03:34:47 +08:00
// RUN: %clang_cc1 -fsyntax-only -pedantic -verify -std=c++98 %s
// RUN: %clang_cc1 -fsyntax-only -pedantic -verify -std=c++11 %s
2010-06-30 08:20:43 +08:00
struct ValueInt
{
ValueInt ( int v = 0 ) : ValueLength ( v ) { }
operator int ( ) const { return ValueLength ; } // expected-note 3{{conversion to integral type 'int' declared here}}
private :
int ValueLength ;
} ;
enum E { e } ;
struct ValueEnum {
operator E ( ) const ; // expected-note{{conversion to enumeration type 'E' declared here}}
} ;
struct ValueBoth : ValueInt , ValueEnum { } ;
struct IndirectValueInt : ValueInt { } ;
2015-01-19 09:44:02 +08:00
struct TwoValueInts : ValueInt , IndirectValueInt { } ; // expected-warning{{direct base 'ValueInt' is inaccessible due to ambiguity:\n struct TwoValueInts -> struct ValueInt\n struct TwoValueInts -> struct IndirectValueInt -> struct ValueInt}}
2010-06-30 08:20:43 +08:00
void test ( ) {
2015-11-12 03:34:47 +08:00
( void ) new int [ ValueInt ( 10 ) ] ;
# if __cplusplus <= 199711L // C++03 or earlier modes
// expected-warning@-2{{implicit conversion from array size expression of type 'ValueInt' to integral type 'int' is a C++11 extension}}
# endif
( void ) new int [ ValueEnum ( ) ] ;
# if __cplusplus <= 199711L
// expected-warning@-2{{implicit conversion from array size expression of type 'ValueEnum' to enumeration type 'E' is a C++11 extension}}
# endif
2010-06-30 08:20:43 +08:00
( void ) new int [ ValueBoth ( ) ] ; // expected-error{{ambiguous conversion of array size expression of type 'ValueBoth' to an integral or enumeration type}}
( void ) new int [ TwoValueInts ( ) ] ; // expected-error{{ambiguous conversion of array size expression of type 'TwoValueInts' to an integral or enumeration type}}
}