xref: /llvm-project/clang/test/Modules/using-decl.cpp (revision 5e3fb7616dda7343676f9f06677efaa56de115d4)
1fd8634a0SRichard Smith // RUN: rm -rf %t
2f091e129SRichard Smith // RUN: %clang_cc1 -x objective-c++ -std=c++11 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -I %S/Inputs %s -verify -DEARLY_IMPORT
3f091e129SRichard Smith // RUN: %clang_cc1 -x objective-c++ -std=c++11 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -I %S/Inputs %s -verify -UEARLY_IMPORT
4*ec4ad5acSRichard Smith // RUN: %clang_cc1 -x objective-c++ -std=c++11 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -I %S/Inputs %s -verify -DEARLY_IMPORT -fmodules-local-submodule-visibility
5*ec4ad5acSRichard Smith // RUN: %clang_cc1 -x objective-c++ -std=c++11 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -I %S/Inputs %s -verify -UEARLY_IMPORT -fmodules-local-submodule-visibility
6fd8634a0SRichard Smith 
7f091e129SRichard Smith #ifdef EARLY_IMPORT
8fd8634a0SRichard Smith @import using_decl.a;
9*ec4ad5acSRichard Smith namespace UsingDecl {
10*ec4ad5acSRichard Smith   using ::merged;
11*ec4ad5acSRichard Smith }
12*ec4ad5acSRichard Smith int k = UsingDecl::merged;
13f091e129SRichard Smith #endif
14fd8634a0SRichard Smith 
15f091e129SRichard Smith namespace Y {
16f091e129SRichard Smith   int conflicting_hidden_using_decl;
17f091e129SRichard Smith   int conflicting_hidden_using_decl_fn_2();
18f091e129SRichard Smith   int conflicting_hidden_using_decl_var_2;
19f091e129SRichard Smith   struct conflicting_hidden_using_decl_struct_2;
20f091e129SRichard Smith 
21f091e129SRichard Smith   struct conflicting_hidden_using_decl_mixed_4 {};
22f091e129SRichard Smith   int conflicting_hidden_using_decl_mixed_5;
23f091e129SRichard Smith   int conflicting_hidden_using_decl_mixed_6();
24f091e129SRichard Smith }
25f091e129SRichard Smith 
26f091e129SRichard Smith using Y::conflicting_hidden_using_decl;
27f091e129SRichard Smith int conflicting_hidden_using_decl_fn();
28f091e129SRichard Smith int conflicting_hidden_using_decl_var;
29f091e129SRichard Smith struct conflicting_hidden_using_decl_struct {};
30f091e129SRichard Smith using Y::conflicting_hidden_using_decl_fn_2;
31f091e129SRichard Smith using Y::conflicting_hidden_using_decl_var_2;
32f091e129SRichard Smith using Y::conflicting_hidden_using_decl_struct_2;
33f091e129SRichard Smith 
34f091e129SRichard Smith struct conflicting_hidden_using_decl_mixed_1 {};
35f091e129SRichard Smith int conflicting_hidden_using_decl_mixed_2;
36f091e129SRichard Smith int conflicting_hidden_using_decl_mixed_3();
37f091e129SRichard Smith using Y::conflicting_hidden_using_decl_mixed_4;
38f091e129SRichard Smith using Y::conflicting_hidden_using_decl_mixed_5;
39f091e129SRichard Smith using Y::conflicting_hidden_using_decl_mixed_6;
40f091e129SRichard Smith 
41f091e129SRichard Smith template<typename T> int use(T);
test_conflicting()42f091e129SRichard Smith void test_conflicting() {
43f091e129SRichard Smith   use(conflicting_hidden_using_decl);
44f091e129SRichard Smith   use(conflicting_hidden_using_decl_fn());
45f091e129SRichard Smith   use(conflicting_hidden_using_decl_var);
46f091e129SRichard Smith   use(conflicting_hidden_using_decl_fn_2());
47f091e129SRichard Smith   use(conflicting_hidden_using_decl_var_2);
48f091e129SRichard Smith   use(conflicting_hidden_using_decl_mixed_1());
49f091e129SRichard Smith   use(conflicting_hidden_using_decl_mixed_2);
50f091e129SRichard Smith   use(conflicting_hidden_using_decl_mixed_3());
51f091e129SRichard Smith   use(conflicting_hidden_using_decl_mixed_4());
52f091e129SRichard Smith   use(conflicting_hidden_using_decl_mixed_5);
53f091e129SRichard Smith   use(conflicting_hidden_using_decl_mixed_6());
54f091e129SRichard Smith }
55f091e129SRichard Smith 
56f091e129SRichard Smith #ifndef EARLY_IMPORT
57f091e129SRichard Smith @import using_decl.a;
58f091e129SRichard Smith #endif
59f091e129SRichard Smith 
60fd8634a0SRichard Smith UsingDecl::using_decl_type x = UsingDecl::using_decl_var;
61fd8634a0SRichard Smith UsingDecl::inner y = x;
62f091e129SRichard Smith 
63f091e129SRichard Smith @import using_decl.b;
64f091e129SRichard Smith 
test_conflicting_2()65f091e129SRichard Smith void test_conflicting_2() {
66f091e129SRichard Smith   use(conflicting_hidden_using_decl);         // expected-error {{ambiguous}}
67f091e129SRichard Smith   use(conflicting_hidden_using_decl_fn());    // expected-error {{ambiguous}}
68f091e129SRichard Smith   use(conflicting_hidden_using_decl_var);     // expected-error {{ambiguous}}
69f091e129SRichard Smith   use(conflicting_hidden_using_decl_fn_2());  // expected-error {{ambiguous}}
70f091e129SRichard Smith   use(conflicting_hidden_using_decl_var_2);   // expected-error {{ambiguous}}
71f091e129SRichard Smith   use(conflicting_hidden_using_decl_mixed_1); // ok, struct hidden
72f091e129SRichard Smith   use(conflicting_hidden_using_decl_mixed_2); // expected-error {{ambiguous}}
73f091e129SRichard Smith   use(conflicting_hidden_using_decl_mixed_3); // ok, struct hidden
74f091e129SRichard Smith   use(conflicting_hidden_using_decl_mixed_4); // ok, struct hidden
75f091e129SRichard Smith   use(conflicting_hidden_using_decl_mixed_5); // expected-error {{ambiguous}}
76f091e129SRichard Smith   use(conflicting_hidden_using_decl_mixed_6); // ok, struct hidden
77f091e129SRichard Smith   // expected-note@using-decl.cpp:* 7{{candidate}}
78f091e129SRichard Smith   // expected-note@using-decl-b.h:* 7{{candidate}}
79f091e129SRichard Smith 
80f091e129SRichard Smith   int conflicting_hidden_using_decl_mixed_1::*p1;
81f091e129SRichard Smith   int conflicting_hidden_using_decl_mixed_3::*p3;
82f091e129SRichard Smith   int conflicting_hidden_using_decl_mixed_4::*p4;
83f091e129SRichard Smith   int conflicting_hidden_using_decl_mixed_6::*p6;
84f091e129SRichard Smith }
85