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