2011-02-19 10:53:41 +08:00
// RUN: %clang_cc1 -fsyntax-only -verify %s
// Make sure we don't produce invalid IR.
// RUN: %clang_cc1 -emit-llvm-only %s
namespace test1 {
static void foo ( ) ; // expected-warning {{function 'test1::foo' has internal linkage but is not defined}}
template < class T > static void bar ( ) ; // expected-warning {{function 'test1::bar<int>' has internal linkage but is not defined}}
void test ( ) {
foo ( ) ; // expected-note {{used here}}
bar < int > ( ) ; // expected-note {{used here}}
}
}
namespace test2 {
namespace {
void foo ( ) ; // expected-warning {{function 'test2::<anonymous namespace>::foo' has internal linkage but is not defined}}
extern int var ; // expected-warning {{variable 'test2::<anonymous namespace>::var' has internal linkage but is not defined}}
template < class T > void bar ( ) ; // expected-warning {{function 'test2::<anonymous namespace>::bar<int>' has internal linkage but is not defined}}
}
void test ( ) {
foo ( ) ; // expected-note {{used here}}
var = 0 ; // expected-note {{used here}}
bar < int > ( ) ; // expected-note {{used here}}
}
}
namespace test3 {
namespace {
void foo ( ) ;
extern int var ;
template < class T > void bar ( ) ;
}
void test ( ) {
foo ( ) ;
var = 0 ;
bar < int > ( ) ;
}
namespace {
void foo ( ) { }
int var = 0 ;
template < class T > void bar ( ) { }
}
}
namespace test4 {
namespace {
struct A {
A ( ) ; // expected-warning {{function 'test4::<anonymous namespace>::A::A' has internal linkage but is not defined}}
~ A ( ) ; // expected-warning {{function 'test4::<anonymous namespace>::A::~A' has internal linkage but is not defined}}
virtual void foo ( ) ; // expected-warning {{function 'test4::<anonymous namespace>::A::foo' has internal linkage but is not defined}}
virtual void bar ( ) = 0 ;
virtual void baz ( ) ; // expected-warning {{function 'test4::<anonymous namespace>::A::baz' has internal linkage but is not defined}}
} ;
}
void test ( A & a ) {
a . foo ( ) ; // expected-note {{used here}}
a . bar ( ) ;
a . baz ( ) ; // expected-note {{used here}}
}
struct Test : A {
Test ( ) { } // expected-note 2 {{used here}}
} ;
}
// rdar://problem/9014651
namespace test5 {
namespace {
struct A { } ;
}
template < class N > struct B {
static int var ; // expected-warning {{variable 'test5::B<test5::<anonymous>::A>::var' has internal linkage but is not defined}}
static void foo ( ) ; // expected-warning {{function 'test5::B<test5::<anonymous>::A>::foo' has internal linkage but is not defined}}
} ;
void test ( ) {
B < A > : : var = 0 ; // expected-note {{used here}}
B < A > : : foo ( ) ; // expected-note {{used here}}
}
}
2011-02-22 03:25:48 +08:00
namespace test6 {
template < class T > struct A {
static const int zero = 0 ;
static const int one = 1 ;
static const int two = 2 ;
int value ;
A ( ) : value ( zero ) {
value = one ;
}
} ;
namespace { struct Internal ; }
void test ( ) {
A < Internal > a ;
a . value = A < Internal > : : two ;
}
}
2011-02-25 16:52:25 +08:00
// We support (as an extension) private, undefined copy constructors when
// a temporary is bound to a reference even in C++98. Similarly, we shouldn't
// warn about this copy constructor being used without a definition.
namespace PR9323 {
namespace {
struct Uncopyable {
Uncopyable ( ) { }
private :
Uncopyable ( const Uncopyable & ) ; // expected-note {{declared private here}}
} ;
}
void f ( const Uncopyable & ) { }
void test ( ) {
f ( Uncopyable ( ) ) ; // expected-warning {{C++98 requires an accessible copy constructor}}
} ;
}
2012-02-03 07:15:15 +08:00
namespace std { class type_info ; } ;
namespace cxx11_odr_rules {
// Note: the way this test is written isn't really ideal, but there really
// isn't any other way to check that the odr-used logic for constants
// is working without working implicit capture in lambda-expressions.
// (The more accurate used-but-not-defined warning is the only other visible
// effect of accurate odr-used computation.)
//
// Note that the warning in question can trigger in cases some people would
// consider false positives; hopefully that happens rarely in practice.
2012-02-04 08:54:05 +08:00
//
// FIXME: Suppressing this test while I figure out how to fix a bug in the
// odr-use marking code.
2012-02-03 07:15:15 +08:00
namespace {
struct A {
static const int unused = 10 ;
2012-02-04 08:54:05 +08:00
static const int used1 = 20 ; // xpected-warning {{internal linkage}}
static const int used2 = 20 ; // xpected-warning {{internal linkage}}
2012-02-03 07:15:15 +08:00
virtual ~ A ( ) { }
} ;
}
void a ( int , int ) ;
A & p ( const int & ) { static A a ; return a ; }
// Check handling of default arguments
void b ( int = A : : unused ) ;
void tests ( ) {
// Basic test
a ( A : : unused , A : : unused ) ;
// Check that nesting an unevaluated or constant-evaluated context does
// the right thing.
a ( A : : unused , sizeof ( int [ 10 ] ) ) ;
// Check that the checks work with unevaluated contexts
( void ) sizeof ( p ( A : : used1 ) ) ;
2012-02-04 08:54:05 +08:00
( void ) typeid ( p ( A : : used1 ) ) ; // xpected-note {{used here}}
2012-02-03 07:15:15 +08:00
// Misc other testing
2012-02-04 08:54:05 +08:00
a ( A : : unused , 1 ? A : : used2 : A : : used2 ) ; // xpected-note {{used here}}
2012-02-03 07:15:15 +08:00
b ( ) ;
}
}
2012-02-08 11:07:05 +08:00
namespace OverloadUse {
namespace {
void f ( ) ;
void f ( int ) ; // expected-warning {{function 'OverloadUse::<anonymous namespace>::f' has internal linkage but is not defined}}
}
template < void x ( ) > void t ( int * ) { x ( ) ; }
template < void x ( int ) > void t ( long * ) { x ( 10 ) ; } // expected-note {{used here}}
void g ( ) { long a ; t < f > ( & a ) ; }
}
2012-12-30 07:43:00 +08:00
namespace test7 {
typedef struct {
void bar ( ) ;
void foo ( ) {
bar ( ) ;
}
} A ;
}
namespace test8 {
typedef struct {
void bar ( ) ; // expected-warning {{function 'test8::<anonymous struct>::bar' has internal linkage but is not defined}}
void foo ( ) {
bar ( ) ; // expected-note {{used here}}
}
} * A ;
}
2013-01-31 09:34:31 +08:00
namespace test9 {
namespace {
struct X {
virtual void notused ( ) = 0 ;
virtual void used ( ) = 0 ; // expected-warning {{function 'test9::<anonymous namespace>::X::used' has internal linkage but is not defined}}
} ;
}
void test ( X & x ) {
x . notused ( ) ;
x . X : : used ( ) ; // expected-note {{used here}}
}
}
2013-02-02 08:25:55 +08:00
namespace test10 {
namespace {
struct X {
virtual void notused ( ) = 0 ;
virtual void used ( ) = 0 ; // expected-warning {{function 'test10::<anonymous namespace>::X::used' has internal linkage but is not defined}}
void test ( ) {
notused ( ) ;
( void ) & X : : notused ;
( this - > * & X : : notused ) ( ) ;
X : : used ( ) ; // expected-note {{used here}}
}
} ;
struct Y : X {
using X : : notused ;
} ;
}
}
2013-02-07 13:08:22 +08:00
namespace test11 {
namespace {
struct A {
virtual bool operator ( ) ( ) const = 0 ;
virtual void operator ! ( ) const = 0 ;
virtual bool operator + ( const A & ) const = 0 ;
virtual int operator [ ] ( int ) const = 0 ;
virtual const A * operator - > ( ) const = 0 ;
int member ;
} ;
struct B {
bool operator ( ) ( ) const ; // expected-warning {{function 'test11::<anonymous namespace>::B::operator()' has internal linkage but is not defined}}
void operator ! ( ) const ; // expected-warning {{function 'test11::<anonymous namespace>::B::operator!' has internal linkage but is not defined}}
bool operator + ( const B & ) const ; // expected-warning {{function 'test11::<anonymous namespace>::B::operator+' has internal linkage but is not defined}}
int operator [ ] ( int ) const ; // expected-warning {{function 'test11::<anonymous namespace>::B::operator[]' has internal linkage but is not defined}}
const B * operator - > ( ) const ; // expected-warning {{function 'test11::<anonymous namespace>::B::operator->' has internal linkage but is not defined}}
int member ;
} ;
}
void test1 ( A & a1 , A & a2 ) {
a1 ( ) ;
! a1 ;
a1 + a2 ;
a1 [ 0 ] ;
( void ) a1 - > member ;
}
void test2 ( B & b1 , B & b2 ) {
b1 ( ) ; // expected-note {{used here}}
! b1 ; // expected-note {{used here}}
b1 + b2 ; // expected-note {{used here}}
b1 [ 0 ] ; // expected-note {{used here}}
( void ) b1 - > member ; // expected-note {{used here}}
}
}
2013-02-12 16:08:54 +08:00
namespace test12 {
class T1 { } ; class T2 { } ; class T3 { } ; class T4 { } ; class T5 { } ; class T6 { } ;
class T7 { } ;
namespace {
struct Cls {
virtual void f ( int ) = 0 ;
virtual void f ( int , double ) = 0 ;
void g ( int ) ; // expected-warning {{function 'test12::<anonymous namespace>::Cls::g' has internal linkage but is not defined}}
void g ( int , double ) ;
virtual operator T1 ( ) = 0 ;
virtual operator T2 ( ) = 0 ;
virtual operator T3 & ( ) = 0 ;
operator T4 ( ) ; // expected-warning {{function 'test12::<anonymous namespace>::Cls::operator T4' has internal linkage but is not defined}}
operator T5 ( ) ; // expected-warning {{function 'test12::<anonymous namespace>::Cls::operator T5' has internal linkage but is not defined}}
operator T6 & ( ) ; // expected-warning {{function 'test12::<anonymous namespace>::Cls::operator class test12::T6 &' has internal linkage but is not defined}}
} ;
struct Cls2 {
Cls2 ( T7 ) ; // expected-warning {{function 'test12::<anonymous namespace>::Cls2::Cls2' has internal linkage but is not defined}}
} ;
}
void test ( Cls & c ) {
c . f ( 7 ) ;
c . g ( 7 ) ; // expected-note {{used here}}
( void ) static_cast < T1 > ( c ) ;
T2 t2 = c ;
T3 & t3 = c ;
( void ) static_cast < T4 > ( c ) ; // expected-note {{used here}}
T5 t5 = c ; // expected-note {{used here}}
T6 & t6 = c ; // expected-note {{used here}}
Cls2 obj1 ( ( T7 ( ) ) ) ; // expected-note {{used here}}
}
}
2013-02-14 08:55:17 +08:00
namespace test13 {
namespace {
struct X {
virtual void f ( ) { }
} ;
struct Y : public X {
virtual void f ( ) = 0 ;
virtual void g ( ) {
X : : f ( ) ;
}
} ;
}
}
2013-04-26 09:30:23 +08:00
namespace test14 {
extern " C " const int foo ;
int f ( ) {
return foo ;
}
}