2011-06-06 06:42:48 +08:00
// RUN: %clang_cc1 -fsyntax-only -verify -std=c++0x %s
2009-06-13 02:53:02 +08:00
typedef double A ;
template < typename T > class B {
typedef int A ;
} ;
template < typename T > struct X : B < T > {
static A a ;
} ;
int a0 [ sizeof ( X < int > : : a ) = = sizeof ( double ) ? 1 : - 1 ] ;
// PR4365.
template < class T > class Q ;
template < class T > class R : Q < T > { T current ; } ;
2009-11-25 04:33:45 +08:00
namespace test0 {
template < class T > class Base {
2010-04-10 03:03:51 +08:00
public :
2009-11-25 04:33:45 +08:00
void instance_foo ( ) ;
static void static_foo ( ) ;
class Inner {
2010-04-10 03:03:51 +08:00
public :
2009-11-25 04:33:45 +08:00
void instance_foo ( ) ;
static void static_foo ( ) ;
} ;
} ;
template < class T > class Derived1 : Base < T > {
2010-04-10 03:03:51 +08:00
public :
2009-11-25 04:33:45 +08:00
void test0 ( ) {
Base < T > : : static_foo ( ) ;
Base < T > : : instance_foo ( ) ;
}
void test1 ( ) {
Base < T > : : Inner : : static_foo ( ) ;
Base < T > : : Inner : : instance_foo ( ) ; // expected-error {{call to non-static member function without an object argument}}
}
static void test2 ( ) {
Base < T > : : static_foo ( ) ;
Base < T > : : instance_foo ( ) ; // expected-error {{call to non-static member function without an object argument}}
}
static void test3 ( ) {
Base < T > : : Inner : : static_foo ( ) ;
Base < T > : : Inner : : instance_foo ( ) ; // expected-error {{call to non-static member function without an object argument}}
}
} ;
template < class T > class Derived2 : Base < T > : : Inner {
2010-04-10 03:03:51 +08:00
public :
2009-11-25 04:33:45 +08:00
void test0 ( ) {
Base < T > : : static_foo ( ) ;
Base < T > : : instance_foo ( ) ; // expected-error {{call to non-static member function without an object argument}}
}
void test1 ( ) {
Base < T > : : Inner : : static_foo ( ) ;
Base < T > : : Inner : : instance_foo ( ) ;
}
static void test2 ( ) {
Base < T > : : static_foo ( ) ;
Base < T > : : instance_foo ( ) ; // expected-error {{call to non-static member function without an object argument}}
}
static void test3 ( ) {
Base < T > : : Inner : : static_foo ( ) ;
Base < T > : : Inner : : instance_foo ( ) ; // expected-error {{call to non-static member function without an object argument}}
}
} ;
void test0 ( ) {
Derived1 < int > d1 ;
d1 . test0 ( ) ;
d1 . test1 ( ) ; // expected-note {{in instantiation of member function}}
d1 . test2 ( ) ; // expected-note {{in instantiation of member function}}
d1 . test3 ( ) ; // expected-note {{in instantiation of member function}}
Derived2 < int > d2 ;
d2 . test0 ( ) ; // expected-note {{in instantiation of member function}}
d2 . test1 ( ) ;
d2 . test2 ( ) ; // expected-note {{in instantiation of member function}}
d2 . test3 ( ) ; // expected-note {{in instantiation of member function}}
}
}
2009-12-16 16:11:27 +08:00
namespace test1 {
template < class T > struct Base {
void foo ( T ) ; // expected-note {{must qualify identifier to find this declaration in dependent base class}}
} ;
template < class T > struct Derived : Base < T > {
void doFoo ( T v ) {
2009-12-16 20:17:52 +08:00
foo ( v ) ; // expected-error {{use of undeclared identifier}}
2009-12-16 16:11:27 +08:00
}
} ;
template struct Derived < int > ; // expected-note {{requested here}}
}
2011-02-04 21:35:07 +08:00
namespace PR8966 {
template < class T >
class MyClassCore
{
} ;
template < class T >
class MyClass : public MyClassCore < T >
{
public :
enum {
N
} ;
// static member declaration
static const char * array [ N ] ;
void f ( ) {
MyClass < T > : : InBase = 17 ;
}
} ;
// static member definition
template < class T >
const char * MyClass < T > : : array [ MyClass < T > : : N ] = { " A " , " B " , " C " } ;
}
2011-06-06 06:42:48 +08:00
namespace std {
inline namespace v1 {
template < typename T > struct basic_ostream ;
}
namespace inner {
template < typename T > struct vector { } ;
}
using inner : : vector ;
template < typename T , typename U > struct pair { } ;
typedef basic_ostream < char > ostream ;
extern ostream cout ;
std : : ostream & operator < < ( std : : ostream & out , const char * ) ;
}
namespace PR10053 {
template < typename T > struct A {
T t ;
A ( ) {
2011-06-14 20:59:25 +08:00
f ( t ) ; // expected-error {{call to function 'f' that is neither visible in the template definition nor found by argument-dependent lookup}}
2011-06-06 06:42:48 +08:00
}
} ;
void f ( int & ) ; // expected-note {{'f' should be declared prior to the call site}}
A < int > a ; // expected-note {{in instantiation of member function}}
namespace N {
namespace M {
template < typename T > int g ( T t ) {
2011-06-14 20:59:25 +08:00
f ( t ) ; // expected-error {{call to function 'f' that is neither visible in the template definition nor found by argument-dependent lookup}}
2011-06-06 06:42:48 +08:00
} ;
}
void f ( char & ) ; // expected-note {{'f' should be declared prior to the call site}}
}
void f ( char & ) ;
int k = N : : M : : g < char > ( 0 ) ; ; // expected-note {{in instantiation of function}}
namespace O {
void f ( char & ) ; // expected-note {{candidate function not viable}}
template < typename T > struct C {
static const int n = f ( T ( ) ) ; // expected-error {{no matching function}}
} ;
}
int f ( double ) ; // no note, shadowed by O::f
O : : C < double > c ; // expected-note {{requested here}}
// Example from www/compatibility.html
namespace my_file {
template < typename T > T Squared ( T x ) {
2011-06-14 20:59:25 +08:00
return Multiply ( x , x ) ; // expected-error {{neither visible in the template definition nor found by argument-dependent lookup}}
2011-06-06 06:42:48 +08:00
}
int Multiply ( int x , int y ) { // expected-note {{should be declared prior to the call site}}
return x * y ;
}
int main ( ) {
Squared ( 5 ) ; // expected-note {{here}}
}
}
// Example from www/compatibility.html
namespace my_file2 {
template < typename T >
void Dump ( const T & value ) {
2011-06-14 20:59:25 +08:00
std : : cout < < value < < " \n " ; // expected-error {{neither visible in the template definition nor found by argument-dependent lookup}}
2011-06-06 06:42:48 +08:00
}
namespace ns {
struct Data { } ;
}
std : : ostream & operator < < ( std : : ostream & out , ns : : Data data ) { // expected-note {{should be declared prior to the call site or in namespace 'PR10053::my_file2::ns'}}
return out < < " Some data " ;
}
void Use ( ) {
Dump ( ns : : Data ( ) ) ; // expected-note {{here}}
}
}
namespace my_file2_a {
template < typename T >
void Dump ( const T & value ) {
2011-06-14 20:59:25 +08:00
print ( std : : cout , value ) ; // expected-error 4{{neither visible in the template definition nor found by argument-dependent lookup}}
2011-06-06 06:42:48 +08:00
}
namespace ns {
struct Data { } ;
}
namespace ns2 {
struct Data { } ;
}
std : : ostream & print ( std : : ostream & out , int ) ; // expected-note-re {{should be declared prior to the call site$}}
std : : ostream & print ( std : : ostream & out , ns : : Data ) ; // expected-note {{should be declared prior to the call site or in namespace 'PR10053::my_file2_a::ns'}}
std : : ostream & print ( std : : ostream & out , std : : vector < ns2 : : Data > ) ; // expected-note {{should be declared prior to the call site or in namespace 'PR10053::my_file2_a::ns2'}}
std : : ostream & print ( std : : ostream & out , std : : pair < ns : : Data , ns2 : : Data > ) ; // expected-note {{should be declared prior to the call site or in an associated namespace of one of its arguments}}
void Use ( ) {
Dump ( 0 ) ; // expected-note {{requested here}}
Dump ( ns : : Data ( ) ) ; // expected-note {{requested here}}
Dump ( std : : vector < ns2 : : Data > ( ) ) ; // expected-note {{requested here}}
Dump ( std : : pair < ns : : Data , ns2 : : Data > ( ) ) ; // expected-note {{requested here}}
}
}
namespace unary {
template < typename T >
T Negate ( const T & value ) {
2011-06-14 20:59:25 +08:00
return ! value ; // expected-error {{call to function 'operator!' that is neither visible in the template definition nor found by argument-dependent lookup}}
2011-06-06 06:42:48 +08:00
}
namespace ns {
struct Data { } ;
}
ns : : Data operator ! ( ns : : Data ) ; // expected-note {{should be declared prior to the call site or in namespace 'PR10053::unary::ns'}}
void Use ( ) {
Negate ( ns : : Data ( ) ) ; // expected-note {{requested here}}
}
}
}
2011-06-27 06:19:54 +08:00
namespace PR10187 {
namespace A {
template < typename T >
struct S {
void f ( ) {
for ( auto & a : e )
__range ( a ) ; // expected-error {{undeclared identifier '__range'}}
}
int e [ 10 ] ;
} ;
void g ( ) {
S < int > ( ) . f ( ) ; // expected-note {{here}}
}
}
namespace B {
template < typename T > void g ( ) ; // expected-note {{not viable}}
template < typename T > void f ( ) {
g < int > ( T ( ) ) ; // expected-error {{no matching function}}
}
namespace {
struct S { } ;
}
void g ( S ) ;
template void f < S > ( ) ; // expected-note {{here}}
}
}