module-private.cpp revision e389585f8a40f80004d3b98b99f3980305ef78a0
18d267c57afb3af418ed5281b7a9bb4555d701a82Douglas Gregor// RUN: mkdir -p %t 28d267c57afb3af418ed5281b7a9bb4555d701a82Douglas Gregor// RUN: %clang_cc1 -x c++ -emit-module -o %t/left.pcm %s -D MODULE_LEFT 38d267c57afb3af418ed5281b7a9bb4555d701a82Douglas Gregor// RUN: %clang_cc1 -x c++ -emit-module -o %t/right.pcm %s -D MODULE_RIGHT 48d267c57afb3af418ed5281b7a9bb4555d701a82Douglas Gregor// RUN: %clang_cc1 -I %t %s -verify 58d267c57afb3af418ed5281b7a9bb4555d701a82Douglas Gregor 68d267c57afb3af418ed5281b7a9bb4555d701a82Douglas Gregor#if defined(MODULE_LEFT) 78d267c57afb3af418ed5281b7a9bb4555d701a82Douglas Gregor 86311d2bb3db1ec1064f45a14983ae5806adc676aDouglas Gregor__module_private__ struct HiddenStruct; 96311d2bb3db1ec1064f45a14983ae5806adc676aDouglas Gregor 106311d2bb3db1ec1064f45a14983ae5806adc676aDouglas Gregorstruct HiddenStruct { 118d267c57afb3af418ed5281b7a9bb4555d701a82Douglas Gregor}; 128d267c57afb3af418ed5281b7a9bb4555d701a82Douglas Gregor 138d267c57afb3af418ed5281b7a9bb4555d701a82Douglas Gregor 148d267c57afb3af418ed5281b7a9bb4555d701a82Douglas Gregorint &f0(int); 158d267c57afb3af418ed5281b7a9bb4555d701a82Douglas Gregor 168d267c57afb3af418ed5281b7a9bb4555d701a82Douglas Gregortemplate<typename T> 178d267c57afb3af418ed5281b7a9bb4555d701a82Douglas Gregor__module_private__ void f1(T*); 188d267c57afb3af418ed5281b7a9bb4555d701a82Douglas Gregor 198d267c57afb3af418ed5281b7a9bb4555d701a82Douglas Gregortemplate<typename T> 206311d2bb3db1ec1064f45a14983ae5806adc676aDouglas Gregorvoid f1(T*); 216311d2bb3db1ec1064f45a14983ae5806adc676aDouglas Gregor 226311d2bb3db1ec1064f45a14983ae5806adc676aDouglas Gregortemplate<typename T> 236311d2bb3db1ec1064f45a14983ae5806adc676aDouglas Gregor__module_private__ class vector; 246311d2bb3db1ec1064f45a14983ae5806adc676aDouglas Gregor 256311d2bb3db1ec1064f45a14983ae5806adc676aDouglas Gregortemplate<typename T> 266311d2bb3db1ec1064f45a14983ae5806adc676aDouglas Gregorclass vector { 278d267c57afb3af418ed5281b7a9bb4555d701a82Douglas Gregor}; 288d267c57afb3af418ed5281b7a9bb4555d701a82Douglas Gregor 298d267c57afb3af418ed5281b7a9bb4555d701a82Douglas Gregorvector<float> vec_float; 308d267c57afb3af418ed5281b7a9bb4555d701a82Douglas Gregor 318d267c57afb3af418ed5281b7a9bb4555d701a82Douglas Gregortypedef __module_private__ int Integer; 326311d2bb3db1ec1064f45a14983ae5806adc676aDouglas Gregortypedef int Integer; 338d267c57afb3af418ed5281b7a9bb4555d701a82Douglas Gregor 348d267c57afb3af418ed5281b7a9bb4555d701a82Douglas Gregor#elif defined(MODULE_RIGHT) 358d267c57afb3af418ed5281b7a9bb4555d701a82Douglas Gregor__module_private__ double &f0(double); 366311d2bb3db1ec1064f45a14983ae5806adc676aDouglas Gregordouble &f0(double); 378d267c57afb3af418ed5281b7a9bb4555d701a82Douglas Gregor 388d267c57afb3af418ed5281b7a9bb4555d701a82Douglas Gregor__module_private__ int hidden_var; 398d267c57afb3af418ed5281b7a9bb4555d701a82Douglas Gregor 408d267c57afb3af418ed5281b7a9bb4555d701a82Douglas Gregorinline void test_f0_in_right() { 418d267c57afb3af418ed5281b7a9bb4555d701a82Douglas Gregor double &dr = f0(hidden_var); 428d267c57afb3af418ed5281b7a9bb4555d701a82Douglas Gregor} 43591dc84101228dc391fca05193be5870ec661edcDouglas Gregor 44591dc84101228dc391fca05193be5870ec661edcDouglas Gregorstruct VisibleStruct { 45591dc84101228dc391fca05193be5870ec661edcDouglas Gregor __module_private__ int field; 46591dc84101228dc391fca05193be5870ec661edcDouglas Gregor __module_private__ void setField(int f); 47591dc84101228dc391fca05193be5870ec661edcDouglas Gregor}; 48591dc84101228dc391fca05193be5870ec661edcDouglas Gregor 498d267c57afb3af418ed5281b7a9bb4555d701a82Douglas Gregor#else 508d267c57afb3af418ed5281b7a9bb4555d701a82Douglas Gregor__import_module__ left; 518d267c57afb3af418ed5281b7a9bb4555d701a82Douglas Gregor__import_module__ right; 528d267c57afb3af418ed5281b7a9bb4555d701a82Douglas Gregor 538d267c57afb3af418ed5281b7a9bb4555d701a82Douglas Gregorvoid test() { 548d267c57afb3af418ed5281b7a9bb4555d701a82Douglas Gregor int &ir = f0(1.0); // okay: f0() from 'right' is not visible 558d267c57afb3af418ed5281b7a9bb4555d701a82Douglas Gregor} 568d267c57afb3af418ed5281b7a9bb4555d701a82Douglas Gregor 578d267c57afb3af418ed5281b7a9bb4555d701a82Douglas Gregorint test_broken() { 588d267c57afb3af418ed5281b7a9bb4555d701a82Douglas Gregor HiddenStruct hidden; // expected-error{{use of undeclared identifier 'HiddenStruct'}} 598d267c57afb3af418ed5281b7a9bb4555d701a82Douglas Gregor 608d267c57afb3af418ed5281b7a9bb4555d701a82Douglas Gregor Integer i; // expected-error{{use of undeclared identifier 'Integer'}} 618d267c57afb3af418ed5281b7a9bb4555d701a82Douglas Gregor 628d267c57afb3af418ed5281b7a9bb4555d701a82Douglas Gregor int *ip = 0; 638d267c57afb3af418ed5281b7a9bb4555d701a82Douglas Gregor f1(ip); // expected-error{{use of undeclared identifier 'f1'}} 648d267c57afb3af418ed5281b7a9bb4555d701a82Douglas Gregor 658d267c57afb3af418ed5281b7a9bb4555d701a82Douglas Gregor vector<int> vec; // expected-error{{use of undeclared identifier 'vector'}} \ 668d267c57afb3af418ed5281b7a9bb4555d701a82Douglas Gregor // expected-error{{expected '(' for function-style cast or type construction}} \ 678d267c57afb3af418ed5281b7a9bb4555d701a82Douglas Gregor // expected-error{{use of undeclared identifier 'vec'}} 688d267c57afb3af418ed5281b7a9bb4555d701a82Douglas Gregor 69591dc84101228dc391fca05193be5870ec661edcDouglas Gregor VisibleStruct vs; 70591dc84101228dc391fca05193be5870ec661edcDouglas Gregor vs.field = 0; // expected-error{{no member named 'field' in 'VisibleStruct'}} 71591dc84101228dc391fca05193be5870ec661edcDouglas Gregor vs.setField(1); // expected-error{{no member named 'setField' in 'VisibleStruct'}} 72591dc84101228dc391fca05193be5870ec661edcDouglas Gregor 738d267c57afb3af418ed5281b7a9bb4555d701a82Douglas Gregor return hidden_var; // expected-error{{use of undeclared identifier 'hidden_var'}} 748d267c57afb3af418ed5281b7a9bb4555d701a82Douglas Gregor} 758d267c57afb3af418ed5281b7a9bb4555d701a82Douglas Gregor 76e761230ae3751b525cadd8066c74ec278ee4ef57Douglas Gregor// Check for private redeclarations of public entities. 77e761230ae3751b525cadd8066c74ec278ee4ef57Douglas Gregortemplate<typename T> 78e761230ae3751b525cadd8066c74ec278ee4ef57Douglas Gregorclass public_class_template; // expected-note{{previous declaration is here}} 79e761230ae3751b525cadd8066c74ec278ee4ef57Douglas Gregor 80e761230ae3751b525cadd8066c74ec278ee4ef57Douglas Gregortemplate<typename T> 81e761230ae3751b525cadd8066c74ec278ee4ef57Douglas Gregor__module_private__ class public_class_template; // expected-error{{__module_private__ declaration of 'public_class_template' follows public declaration}} 82e761230ae3751b525cadd8066c74ec278ee4ef57Douglas Gregor 83e761230ae3751b525cadd8066c74ec278ee4ef57Douglas Gregor 84e761230ae3751b525cadd8066c74ec278ee4ef57Douglas Gregortypedef int public_typedef; // expected-note{{previous declaration is here}} 85e761230ae3751b525cadd8066c74ec278ee4ef57Douglas Gregortypedef __module_private__ int public_typedef; // expected-error{{__module_private__ declaration of 'public_typedef' follows public declaration}} 86e761230ae3751b525cadd8066c74ec278ee4ef57Douglas Gregor 87e761230ae3751b525cadd8066c74ec278ee4ef57Douglas Gregorextern int public_var; // expected-note{{previous declaration is here}} 88e761230ae3751b525cadd8066c74ec278ee4ef57Douglas Gregorextern __module_private__ int public_var; // expected-error{{__module_private__ declaration of 'public_var' follows public declaration}} 89e761230ae3751b525cadd8066c74ec278ee4ef57Douglas Gregor 90e761230ae3751b525cadd8066c74ec278ee4ef57Douglas Gregorvoid public_func(); // expected-note{{previous declaration is here}} 91e761230ae3751b525cadd8066c74ec278ee4ef57Douglas Gregor__module_private__ void public_func(); // expected-error{{__module_private__ declaration of 'public_func' follows public declaration}} 92e761230ae3751b525cadd8066c74ec278ee4ef57Douglas Gregor 93e761230ae3751b525cadd8066c74ec278ee4ef57Douglas Gregortemplate<typename T> 94e761230ae3751b525cadd8066c74ec278ee4ef57Douglas Gregorvoid public_func_template(); // expected-note{{previous declaration is here}} 95e761230ae3751b525cadd8066c74ec278ee4ef57Douglas Gregortemplate<typename T> 96e761230ae3751b525cadd8066c74ec278ee4ef57Douglas Gregor__module_private__ void public_func_template(); // expected-error{{__module_private__ declaration of 'public_func_template' follows public declaration}} 97e761230ae3751b525cadd8066c74ec278ee4ef57Douglas Gregor 98e761230ae3751b525cadd8066c74ec278ee4ef57Douglas Gregorstruct public_struct; // expected-note{{previous declaration is here}} 99e761230ae3751b525cadd8066c74ec278ee4ef57Douglas Gregor__module_private__ struct public_struct; // expected-error{{__module_private__ declaration of 'public_struct' follows public declaration}} 100e761230ae3751b525cadd8066c74ec278ee4ef57Douglas Gregor 101d023aec8907831a18d3514a95b843a7ee06b6b5eDouglas Gregor// Check for attempts to make specializations private 102d023aec8907831a18d3514a95b843a7ee06b6b5eDouglas Gregortemplate<> __module_private__ void public_func_template<int>(); // expected-error{{template specialization cannot be declared __module_private__}} 103d023aec8907831a18d3514a95b843a7ee06b6b5eDouglas Gregor 104d023aec8907831a18d3514a95b843a7ee06b6b5eDouglas Gregortemplate<typename T> 105d023aec8907831a18d3514a95b843a7ee06b6b5eDouglas Gregorstruct public_class { 106d023aec8907831a18d3514a95b843a7ee06b6b5eDouglas Gregor struct inner_struct; 107d023aec8907831a18d3514a95b843a7ee06b6b5eDouglas Gregor static int static_var; 1086274d30d77870393d83a404dd223b8005f2b8cd5Douglas Gregor 109f3a762a8de396af471f35b77f6897989867c898eDouglas Gregor friend __module_private__ void public_func_friend(); 110f3a762a8de396af471f35b77f6897989867c898eDouglas Gregor friend __module_private__ struct public_struct_friend; 111d023aec8907831a18d3514a95b843a7ee06b6b5eDouglas Gregor}; 112d023aec8907831a18d3514a95b843a7ee06b6b5eDouglas Gregor 113d023aec8907831a18d3514a95b843a7ee06b6b5eDouglas Gregortemplate<> __module_private__ struct public_class<int>::inner_struct { }; // expected-error{{member specialization cannot be declared __module_private__}} 114d023aec8907831a18d3514a95b843a7ee06b6b5eDouglas Gregortemplate<> __module_private__ int public_class<int>::static_var = 17; // expected-error{{member specialization cannot be declared __module_private__}} 115d023aec8907831a18d3514a95b843a7ee06b6b5eDouglas Gregor 116d023aec8907831a18d3514a95b843a7ee06b6b5eDouglas Gregortemplate<> 117d023aec8907831a18d3514a95b843a7ee06b6b5eDouglas Gregor__module_private__ struct public_class<float> { }; // expected-error{{template specialization cannot be declared __module_private__}} 118d023aec8907831a18d3514a95b843a7ee06b6b5eDouglas Gregor 119d023aec8907831a18d3514a95b843a7ee06b6b5eDouglas Gregortemplate<typename T> 120d023aec8907831a18d3514a95b843a7ee06b6b5eDouglas Gregor__module_private__ struct public_class<T *> { }; // expected-error{{partial specialization cannot be declared __module_private__}} 121e761230ae3751b525cadd8066c74ec278ee4ef57Douglas Gregor 122e389585f8a40f80004d3b98b99f3980305ef78a0Douglas Gregor// Check for attempts to make parameters and variables with automatic 123e389585f8a40f80004d3b98b99f3980305ef78a0Douglas Gregor// storage module-private. 124e389585f8a40f80004d3b98b99f3980305ef78a0Douglas Gregor 125e389585f8a40f80004d3b98b99f3980305ef78a0Douglas Gregorvoid local_var_private(__module_private__ int param) { // expected-error{{parameter 'param' cannot be declared __module_private__}} 126e389585f8a40f80004d3b98b99f3980305ef78a0Douglas Gregor __module_private__ struct Local { int x, y; } local; //expected-error{{local variable 'local' cannot be declared __module_private__}} 127e389585f8a40f80004d3b98b99f3980305ef78a0Douglas Gregor 128e389585f8a40f80004d3b98b99f3980305ef78a0Douglas Gregor __module_private__ struct OtherLocal { int x; }; // expected-error{{local struct cannot be declared __module_private__}} 129e389585f8a40f80004d3b98b99f3980305ef78a0Douglas Gregor 130e389585f8a40f80004d3b98b99f3980305ef78a0Douglas Gregor typedef __module_private__ int local_typedef; // expected-error{{typedef 'local_typedef' cannot be declared __module_private__}} 131e389585f8a40f80004d3b98b99f3980305ef78a0Douglas Gregor} 1328d267c57afb3af418ed5281b7a9bb4555d701a82Douglas Gregor#endif 133