1 | // RUN: rm -rf %t |
2 | // RUN: %clang_cc1 -x objective-c++ -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -I %S/Inputs %s -verify |
3 | |
4 | int &global(int); |
5 | int &global2(int); |
6 | |
7 | namespace N6 { |
8 | char &f(char); |
9 | } |
10 | |
11 | namespace N8 { } |
12 | |
13 | namespace LookupBeforeImport { |
14 | int &f(int); |
15 | } |
16 | void testEarly() { |
17 | int &r = LookupBeforeImport::f(1); |
18 | } |
19 | |
20 | @import namespaces_left; |
21 | @import namespaces_right; |
22 | |
23 | void test() { |
24 | int &ir1 = N1::f(1); |
25 | int &ir2 = N2::f(1); |
26 | int &ir3 = N3::f(1); |
27 | int &ir4 = global(1); |
28 | int &ir5 = ::global2(1); |
29 | float &fr1 = N1::f(1.0f); |
30 | float &fr2 = N2::f(1.0f); |
31 | float &fr3 = global(1.0f); |
32 | float &fr4 = ::global2(1.0f); |
33 | float &fr5 = LookupBeforeImport::f(1.0f); |
34 | double &dr1 = N2::f(1.0); |
35 | double &dr2 = N3::f(1.0); |
36 | double &dr3 = global(1.0); |
37 | double &dr4 = ::global2(1.0); |
38 | double &dr5 = LookupBeforeImport::f(1.0); |
39 | |
40 | struct AddAndReexportBeforeImport::S s; |
41 | int k = AddAndReexportBeforeImport::S; |
42 | } |
43 | |
44 | // Test namespaces merged without a common first declaration. |
45 | namespace N5 { |
46 | char &f(char); |
47 | } |
48 | |
49 | namespace N10 { |
50 | int &f(int); |
51 | } |
52 | |
53 | void testMerged() { |
54 | int &ir1 = N5::f(17); |
55 | int &ir2 = N6::f(17); |
56 | int &ir3 = N7::f(17); |
57 | double &fr1 = N5::f(1.0); |
58 | double &fr2 = N6::f(1.0); |
59 | double &fr3 = N7::f(1.0); |
60 | char &cr1 = N5::f('a'); |
61 | char &cr2 = N6::f('b'); |
62 | } |
63 | |
64 | // Test merging of declarations within namespaces that themselves were |
65 | // merged without a common first declaration. |
66 | void testMergedMerged() { |
67 | int &ir1 = N8::f(17); |
68 | int &ir2 = N9::f(17); |
69 | int &ir3 = N10::f(17); |
70 | } |
71 | |
72 | // Test merging when using anonymous namespaces, which does not |
73 | // actually perform any merging. |
74 | void testAnonymousNotMerged() { |
75 | N11::consumeFoo(N11::getFoo()); // expected-error{{cannot initialize a parameter of type 'N11::(anonymous namespace)::Foo *' with an rvalue of type 'N11::(anonymous namespace)::Foo *'}} |
76 | N12::consumeFoo(N12::getFoo()); // expected-error{{cannot initialize a parameter of type 'N12::(anonymous namespace)::Foo *' with an rvalue of type 'N12::(anonymous namespace)::Foo *'}} |
77 | } |
78 | |
79 | // expected-note@Inputs/namespaces-right.h:60 {{passing argument to parameter here}} |
80 | // expected-note@Inputs/namespaces-right.h:67 {{passing argument to parameter here}} |
81 | |
82 | // Test that bringing in one name from an overload set does not hide the rest. |
83 | void testPartialImportOfOverloadSet() { |
84 | void (*p)() = N13::p; |
85 | p(); |
86 | N13::f(0); |
87 | } |
88 | |