module-private.cpp 3.8 KB

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