namespaces.cpp revision 1c3875dab92f3b0a25212c80863e452cb269d3f1
1// RUN: rm -rf %t 2// RUN: %clang_cc1 -x objective-c++ -fmodules -fmodule-cache-path %t -I %S/Inputs %s -verify 3 4namespace N6 { 5 char &f(char); 6} 7 8namespace N8 { } 9 10@import namespaces_left; 11@import namespaces_right; 12 13void test() { 14 int &ir1 = N1::f(1); 15 int &ir2 = N2::f(1); 16 int &ir3 = N3::f(1); 17 float &fr1 = N1::f(1.0f); 18 float &fr2 = N2::f(1.0f); 19 double &dr1 = N2::f(1.0); 20 double &dr2 = N3::f(1.0); 21} 22 23// Test namespaces merged without a common first declaration. 24namespace N5 { 25 char &f(char); 26} 27 28namespace N10 { 29 int &f(int); 30} 31 32void testMerged() { 33 int &ir1 = N5::f(17); 34 int &ir2 = N6::f(17); 35 int &ir3 = N7::f(17); 36 double &fr1 = N5::f(1.0); 37 double &fr2 = N6::f(1.0); 38 double &fr3 = N7::f(1.0); 39 char &cr1 = N5::f('a'); 40 char &cr2 = N6::f('b'); 41} 42 43// Test merging of declarations within namespaces that themselves were 44// merged without a common first declaration. 45void testMergedMerged() { 46 int &ir1 = N8::f(17); 47 int &ir2 = N9::f(17); 48 int &ir3 = N10::f(17); 49} 50 51// Test merging when using anonymous namespaces, which does not 52// actually perform any merging. 53// other file: expected-note{{passing argument to parameter here}} 54void testAnonymousNotMerged() { 55 N11::consumeFoo(N11::getFoo()); // expected-error{{cannot initialize a parameter of type 'N11::<anonymous>::Foo *' with an rvalue of type 'N11::<anonymous>::Foo *'}} 56 N12::consumeFoo(N12::getFoo()); // expected-error{{cannot initialize a parameter of type 'N12::<anonymous>::Foo *' with an rvalue of type 'N12::<anonymous>::Foo *'}} 57} 58 59 60// other file: expected-note{{passing argument to parameter here}} 61