2011-10-25 02:26:35 +08:00
// RUN: %clang_cc1 -fsyntax-only -verify -pedantic %s
2009-02-07 21:06:23 +08:00
// C++-specific tests for integral constant expressions.
const int c = 10 ;
int ar [ c ] ;
2009-09-11 01:44:23 +08:00
struct X0 {
static const int value = static_cast < int > ( 4.0 ) ;
} ;
2009-09-11 07:31:45 +08:00
void f ( ) {
if ( const int value = 17 ) {
int array [ value ] ;
}
}
2009-12-04 04:31:57 +08:00
int a ( ) {
2011-12-19 14:19:21 +08:00
const int t = t ; // expected-note {{declared here}}
2010-05-18 11:19:21 +08:00
switch ( 1 ) { // expected-warning {{no case matching constant switch condition '1'}}
2012-01-15 11:51:30 +08:00
case t : ; // expected-error {{not an integral constant expression}} expected-note {{initializer of 't' is not a constant expression}}
2009-12-04 04:31:57 +08:00
}
}
2010-02-06 09:07:37 +08:00
// PR6206: out-of-line definitions are legit
namespace pr6206 {
class Foo {
public :
static const int kBar ;
} ;
const int Foo : : kBar = 20 ;
char Test ( ) {
char str [ Foo : : kBar ] ;
str [ 0 ] = ' 0 ' ;
return str [ 0 ] ;
}
}
2010-02-24 17:03:18 +08:00
// PR6373: default arguments don't count.
void pr6373 ( const unsigned x = 0 ) {
unsigned max = 80 / x ;
}
2011-06-14 13:46:29 +08:00
// rdar://9204520
namespace rdar9204520 {
struct A {
2011-12-30 05:57:33 +08:00
static const int B = int ( 0.75 * 1000 * 1000 ) ; // expected-warning {{not a constant expression; folding it to a constant is a GNU extension}}
2011-06-14 13:46:29 +08:00
} ;
int foo ( ) { return A : : B ; }
}
2011-09-30 05:49:34 +08:00
// PR11040
const int x = 10 ;
int * y = reinterpret_cast < const char & > ( x ) ; // expected-error {{cannot initialize}}
2011-10-11 08:13:24 +08:00
// This isn't an integral constant expression, but make sure it folds anyway.
2011-10-25 02:26:35 +08:00
struct PR8836 { char _ ; long long a ; } ; // expected-warning {{long long}}
2012-02-04 17:53:13 +08:00
int PR8836test [ ( __typeof ( sizeof ( int ) ) ) & reinterpret_cast < const volatile char & > ( ( ( ( PR8836 * ) 0 ) - > a ) ) ] ; // expected-warning {{folded to constant array as an extension}} expected-note {{cast which performs the conversions of a reinterpret_cast is not allowed in a constant expression}}
2011-10-25 02:26:35 +08:00
2012-02-04 17:53:13 +08:00
const int nonconst = 1.0 ; // expected-note {{declared here}}
int arr [ nonconst ] ; // expected-warning {{folded to constant array as an extension}} expected-note {{initializer of 'nonconst' is not a constant expression}}
2011-10-25 02:26:35 +08:00
const int castfloat = static_cast < int > ( 1.0 ) ;
int arr2 [ castfloat ] ; // ok