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