2011-04-15 05:45:45 +08:00
// RUN: %clang_cc1 -fsyntax-only -verify %s
2007-01-23 14:12:15 +08:00
char * const_cast_test ( const char * var )
{
return const_cast < char * > ( var ) ;
}
struct A {
virtual ~ A ( ) { }
} ;
struct B : public A {
} ;
struct B * dynamic_cast_test ( struct A * a )
{
return dynamic_cast < struct B * > ( a ) ;
}
char * reinterpret_cast_test ( )
{
return reinterpret_cast < char * > ( 0xdeadbeef ) ;
}
double static_cast_test ( int i )
{
return static_cast < double > ( i ) ;
}
2008-08-17 03:45:32 +08:00
char postfix_expr_test ( )
{
return reinterpret_cast < char * > ( 0xdeadbeef ) [ 0 ] ;
2009-03-24 10:24:46 +08:00
}
2010-04-30 11:11:01 +08:00
// This was being incorrectly tentatively parsed.
namespace test1 {
2011-04-15 05:45:45 +08:00
template < class T > class A { } ; // expected-note 2{{here}}
2010-04-30 11:11:01 +08:00
void foo ( ) { A < int > ( * ( A < int > * ) 0 ) ; }
}
2011-04-15 05:45:45 +08:00
typedef char * c ;
typedef A * a ;
void test2 ( char x , struct B * b ) {
( void ) const_cast < : : c > ( & x ) ; // expected-error{{found '<::' after a const_cast which forms the digraph '<:' (aka '[') and a ':', did you mean '< ::'?}}
( void ) dynamic_cast < : : a > ( b ) ; // expected-error{{found '<::' after a dynamic_cast which forms the digraph '<:' (aka '[') and a ':', did you mean '< ::'?}}
( void ) reinterpret_cast < : : c > ( x ) ; // expected-error{{found '<::' after a reinterpret_cast which forms the digraph '<:' (aka '[') and a ':', did you mean '< ::'?}}
( void ) static_cast < : : c > ( & x ) ; // expected-error{{found '<::' after a static_cast which forms the digraph '<:' (aka '[') and a ':', did you mean '< ::'?}}
// Do not do digraph correction.
( void ) static_cast < : : c > ( & x ) ; / / \
expected - error { { expected ' < ' after ' static_cast ' } } \
expected - error { { expected expression } } \
expected - error { { expected ' ] ' } } \
expected - note { { to match this ' [ ' } }
( void ) static_cast < : / / expected - error { { expected ' < ' after ' static_cast ' } } \
expected - note { { to match this ' [ ' } }
: c > ( & x ) ; / / expected - error { { expected expression } } \
expected - error { { expected ' ] ' } }
# define LC <:
# define C :
test1 : : A LC : B > c ; // expected-error {{cannot refer to class template 'A' without a template argument list}} expected-error 2{{}} expected-note{{}}
( void ) static_cast LC : c > ( & x ) ; // expected-error {{expected '<' after 'static_cast'}} expected-error 2{{}} expected-note{{}}
test1 : : A < : C B > d ; // expected-error {{cannot refer to class template 'A' without a template argument list}} expected-error 2{{}} expected-note{{}}
( void ) static_cast < : C c > ( & x ) ; // expected-error {{expected '<' after 'static_cast'}} expected-error 2{{}} expected-note{{}}
# define LCC <::
test1 : : A LCC B > e ; // expected-error{{found '<::' after a template name which forms the digraph '<:' (aka '[') and a ':', did you mean '< ::'?}}
( void ) static_cast LCC c > ( & x ) ; // expected-error{{found '<::' after a static_cast which forms the digraph '<:' (aka '[') and a ':', did you mean '< ::'?}}
}
2011-09-20 03:01:00 +08:00
2011-09-21 04:03:50 +08:00
// This note comes from "::D[:F> A5;"
template < class T > class D { } ; // expected-note{{template is declared here}}
2011-09-20 03:01:00 +08:00
template < class T > void E ( ) { } ;
class F { } ;
void test3 ( ) {
: : D < : : F > A1 ; // expected-error{{found '<::' after a template name which forms the digraph '<:' (aka '[') and a ':', did you mean '< ::'?}}
D < : : F > A2 ; // expected-error{{found '<::' after a template name which forms the digraph '<:' (aka '[') and a ':', did you mean '< ::'?}}
: : E < : : F > ( ) ; // expected-error{{found '<::' after a template name which forms the digraph '<:' (aka '[') and a ':', did you mean '< ::'?}}
E < : : F > ( ) ; // expected-error{{found '<::' after a template name which forms the digraph '<:' (aka '[') and a ':', did you mean '< ::'?}}
: : D < : : F > A3 ;
D < : : F > A4 ;
: : E < : : F > ( ) ;
E < : : F > ( ) ;
2011-09-21 04:03:50 +08:00
// Make sure that parser doesn't expand '[:' to '< ::'
: : D [ : F > A5 ; / / expected - error { { cannot refer to class template ' D ' without a template argument list } } \
/ / expected - error { { expected expression } } \
/ / expected - error { { expected ' ] ' } } \
// expected-note {{to match this '['}}
2011-09-20 03:01:00 +08:00
}