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