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 -fmodules-local-submodule-visibility
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 -fmodules-local-submodule-visibility
6
7#ifdef EARLY_IMPORT
8@import using_decl.a;
9namespace UsingDecl {
10  using ::merged;
11}
12int k = UsingDecl::merged;
13#endif
14
15namespace Y {
16  int conflicting_hidden_using_decl;
17  int conflicting_hidden_using_decl_fn_2();
18  int conflicting_hidden_using_decl_var_2;
19  struct conflicting_hidden_using_decl_struct_2;
20
21  struct conflicting_hidden_using_decl_mixed_4 {};
22  int conflicting_hidden_using_decl_mixed_5;
23  int conflicting_hidden_using_decl_mixed_6();
24}
25
26using Y::conflicting_hidden_using_decl;
27int conflicting_hidden_using_decl_fn();
28int conflicting_hidden_using_decl_var;
29struct conflicting_hidden_using_decl_struct {};
30using Y::conflicting_hidden_using_decl_fn_2;
31using Y::conflicting_hidden_using_decl_var_2;
32using Y::conflicting_hidden_using_decl_struct_2;
33
34struct conflicting_hidden_using_decl_mixed_1 {};
35int conflicting_hidden_using_decl_mixed_2;
36int conflicting_hidden_using_decl_mixed_3();
37using Y::conflicting_hidden_using_decl_mixed_4;
38using Y::conflicting_hidden_using_decl_mixed_5;
39using Y::conflicting_hidden_using_decl_mixed_6;
40
41template<typename T> int use(T);
42void test_conflicting() {
43  use(conflicting_hidden_using_decl);
44  use(conflicting_hidden_using_decl_fn());
45  use(conflicting_hidden_using_decl_var);
46  use(conflicting_hidden_using_decl_fn_2());
47  use(conflicting_hidden_using_decl_var_2);
48  use(conflicting_hidden_using_decl_mixed_1());
49  use(conflicting_hidden_using_decl_mixed_2);
50  use(conflicting_hidden_using_decl_mixed_3());
51  use(conflicting_hidden_using_decl_mixed_4());
52  use(conflicting_hidden_using_decl_mixed_5);
53  use(conflicting_hidden_using_decl_mixed_6());
54}
55
56#ifndef EARLY_IMPORT
57@import using_decl.a;
58#endif
59
60UsingDecl::using_decl_type x = UsingDecl::using_decl_var;
61UsingDecl::inner y = x;
62
63@import using_decl.b;
64
65void test_conflicting_2() {
66  use(conflicting_hidden_using_decl);         // expected-error {{ambiguous}}
67  use(conflicting_hidden_using_decl_fn());    // expected-error {{ambiguous}}
68  use(conflicting_hidden_using_decl_var);     // expected-error {{ambiguous}}
69  use(conflicting_hidden_using_decl_fn_2());  // expected-error {{ambiguous}}
70  use(conflicting_hidden_using_decl_var_2);   // expected-error {{ambiguous}}
71  use(conflicting_hidden_using_decl_mixed_1); // ok, struct hidden
72  use(conflicting_hidden_using_decl_mixed_2); // expected-error {{ambiguous}}
73  use(conflicting_hidden_using_decl_mixed_3); // ok, struct hidden
74  use(conflicting_hidden_using_decl_mixed_4); // ok, struct hidden
75  use(conflicting_hidden_using_decl_mixed_5); // expected-error {{ambiguous}}
76  use(conflicting_hidden_using_decl_mixed_6); // ok, struct hidden
77  // expected-note@using-decl.cpp:* 7{{candidate}}
78  // expected-note@using-decl-b.h:* 7{{candidate}}
79
80  int conflicting_hidden_using_decl_mixed_1::*p1;
81  int conflicting_hidden_using_decl_mixed_3::*p3;
82  int conflicting_hidden_using_decl_mixed_4::*p4;
83  int conflicting_hidden_using_decl_mixed_6::*p6;
84}
85