1*67e74705SXin Li // RUN: rm -rf %t 2*67e74705SXin Li // RUN: %clang_cc1 -fmodules -fimplicit-module-maps -x objective-c++ -fmodules-cache-path=%t -fmodule-name=module_private_left -emit-module %S/Inputs/module.map 3*67e74705SXin Li // RUN: %clang_cc1 -fmodules -fimplicit-module-maps -x objective-c++ -fmodules-cache-path=%t -fmodule-name=module_private_right -emit-module %S/Inputs/module.map 4*67e74705SXin Li // RUN: %clang_cc1 -fmodules -fimplicit-module-maps -x objective-c++ -fmodules-cache-path=%t -I %S/Inputs %s -verify 5*67e74705SXin Li // FIXME: When we have a syntax for modules in C++, use that. 6*67e74705SXin Li 7*67e74705SXin Li @import module_private_left; 8*67e74705SXin Li @import module_private_right; 9*67e74705SXin Li test()10*67e74705SXin Livoid test() { 11*67e74705SXin Li int &ir = f0(1.0); // okay: f0() from 'right' is not visible 12*67e74705SXin Li } 13*67e74705SXin Li test_broken()14*67e74705SXin Liint test_broken() { 15*67e74705SXin Li HiddenStruct hidden; // expected-error{{unknown type name 'HiddenStruct'}} 16*67e74705SXin Li Integer i; // expected-error{{unknown type name 'Integer'}} 17*67e74705SXin Li 18*67e74705SXin Li int *ip = 0; 19*67e74705SXin Li f1(ip); // expected-error{{use of undeclared identifier 'f1'}} 20*67e74705SXin Li 21*67e74705SXin Li vector<int> vec; // expected-error{{use of undeclared identifier 'vector'}} \ 22*67e74705SXin Li // expected-error{{expected '(' for function-style cast or type construction}} \ 23*67e74705SXin Li // expected-error{{use of undeclared identifier 'vec'}} 24*67e74705SXin Li 25*67e74705SXin Li VisibleStruct vs; 26*67e74705SXin Li vs.field = 0; // expected-error{{no member named 'field' in 'VisibleStruct'}} 27*67e74705SXin Li vs.setField(1); // expected-error{{no member named 'setField' in 'VisibleStruct'}} 28*67e74705SXin Li 29*67e74705SXin Li return hidden_var; // expected-error{{use of undeclared identifier 'hidden_var'}} 30*67e74705SXin Li } 31*67e74705SXin Li 32*67e74705SXin Li // Check for private redeclarations of public entities. 33*67e74705SXin Li template<typename T> 34*67e74705SXin Li class public_class_template; 35*67e74705SXin Li 36*67e74705SXin Li template<typename T> 37*67e74705SXin Li __module_private__ class public_class_template; 38*67e74705SXin Li 39*67e74705SXin Li 40*67e74705SXin Li typedef int public_typedef; 41*67e74705SXin Li typedef __module_private__ int public_typedef; 42*67e74705SXin Li 43*67e74705SXin Li extern int public_var; 44*67e74705SXin Li extern __module_private__ int public_var; 45*67e74705SXin Li 46*67e74705SXin Li void public_func(); 47*67e74705SXin Li __module_private__ void public_func(); 48*67e74705SXin Li 49*67e74705SXin Li template<typename T> 50*67e74705SXin Li void public_func_template(); 51*67e74705SXin Li template<typename T> 52*67e74705SXin Li __module_private__ void public_func_template(); 53*67e74705SXin Li 54*67e74705SXin Li struct public_struct; 55*67e74705SXin Li __module_private__ struct public_struct; 56*67e74705SXin Li 57*67e74705SXin Li // Check for attempts to make specializations private 58*67e74705SXin Li template<> __module_private__ void public_func_template<int>(); // expected-error{{template specialization cannot be declared __module_private__}} 59*67e74705SXin Li 60*67e74705SXin Li template<typename T> 61*67e74705SXin Li struct public_class { 62*67e74705SXin Li struct inner_struct; 63*67e74705SXin Li static int static_var; 64*67e74705SXin Li 65*67e74705SXin Li friend __module_private__ void public_func_friend(); 66*67e74705SXin Li friend __module_private__ struct public_struct_friend; 67*67e74705SXin Li }; 68*67e74705SXin Li 69*67e74705SXin Li template<> __module_private__ struct public_class<int>::inner_struct { }; // expected-error{{member specialization cannot be declared __module_private__}} 70*67e74705SXin Li template<> __module_private__ int public_class<int>::static_var = 17; // expected-error{{member specialization cannot be declared __module_private__}} 71*67e74705SXin Li 72*67e74705SXin Li template<> 73*67e74705SXin Li __module_private__ struct public_class<float> { }; // expected-error{{template specialization cannot be declared __module_private__}} 74*67e74705SXin Li 75*67e74705SXin Li template<typename T> 76*67e74705SXin Li __module_private__ struct public_class<T *> { }; // expected-error{{partial specialization cannot be declared __module_private__}} 77*67e74705SXin Li 78*67e74705SXin Li // Check for attempts to make parameters and variables with automatic 79*67e74705SXin Li // storage module-private. 80*67e74705SXin Li local_var_private(__module_private__ int param)81*67e74705SXin Livoid local_var_private(__module_private__ int param) { // expected-error{{parameter 'param' cannot be declared __module_private__}} 82*67e74705SXin Li __module_private__ struct Local { int x, y; } local; //expected-error{{local variable 'local' cannot be declared __module_private__}} 83*67e74705SXin Li 84*67e74705SXin Li __module_private__ struct OtherLocal { int x; }; // expected-error{{local struct cannot be declared __module_private__}} 85*67e74705SXin Li 86*67e74705SXin Li typedef __module_private__ int local_typedef; // expected-error{{typedef 'local_typedef' cannot be declared __module_private__}} 87*67e74705SXin Li } 88*67e74705SXin Li 89*67e74705SXin Li // Check struct size 90*67e74705SXin Li struct LikeVisibleStruct { 91*67e74705SXin Li int field; 92*67e74705SXin Li virtual void setField(int f); 93*67e74705SXin Li }; 94*67e74705SXin Li 95*67e74705SXin Li int check_struct_size[sizeof(VisibleStruct) == sizeof(LikeVisibleStruct)? 1 : -1]; 96