blob: 33ec32048af92de0dc0881653bafe8eaa67fa1f9 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
|
// RUN: mkdir -p %t
// RUN: %clang_cc1 -x c++ -emit-module -o %t/left.pcm %s -D MODULE_LEFT
// RUN: %clang_cc1 -x c++ -emit-module -o %t/right.pcm %s -D MODULE_RIGHT
// RUN: %clang_cc1 -I %t %s -verify
#if defined(MODULE_LEFT)
__module_private__ struct HiddenStruct;
struct HiddenStruct {
};
int &f0(int);
template<typename T>
__module_private__ void f1(T*);
template<typename T>
void f1(T*);
template<typename T>
__module_private__ class vector;
template<typename T>
class vector {
};
vector<float> vec_float;
typedef __module_private__ int Integer;
typedef int Integer;
#elif defined(MODULE_RIGHT)
__module_private__ double &f0(double);
double &f0(double);
__module_private__ int hidden_var;
inline void test_f0_in_right() {
double &dr = f0(hidden_var);
}
struct VisibleStruct {
__module_private__ int field;
__module_private__ void setField(int f);
};
#else
__import_module__ left;
__import_module__ right;
void test() {
int &ir = f0(1.0); // okay: f0() from 'right' is not visible
}
int test_broken() {
HiddenStruct hidden; // expected-error{{use of undeclared identifier 'HiddenStruct'}}
Integer i; // expected-error{{use of undeclared identifier 'Integer'}}
int *ip = 0;
f1(ip); // expected-error{{use of undeclared identifier 'f1'}}
vector<int> vec; // expected-error{{use of undeclared identifier 'vector'}} \
// expected-error{{expected '(' for function-style cast or type construction}} \
// expected-error{{use of undeclared identifier 'vec'}}
VisibleStruct vs;
vs.field = 0; // expected-error{{no member named 'field' in 'VisibleStruct'}}
vs.setField(1); // expected-error{{no member named 'setField' in 'VisibleStruct'}}
return hidden_var; // expected-error{{use of undeclared identifier 'hidden_var'}}
}
// Check for private redeclarations of public entities.
template<typename T>
class public_class_template; // expected-note{{previous declaration is here}}
template<typename T>
__module_private__ class public_class_template; // expected-error{{__module_private__ declaration of 'public_class_template' follows public declaration}}
typedef int public_typedef; // expected-note{{previous declaration is here}}
typedef __module_private__ int public_typedef; // expected-error{{__module_private__ declaration of 'public_typedef' follows public declaration}}
extern int public_var; // expected-note{{previous declaration is here}}
extern __module_private__ int public_var; // expected-error{{__module_private__ declaration of 'public_var' follows public declaration}}
void public_func(); // expected-note{{previous declaration is here}}
__module_private__ void public_func(); // expected-error{{__module_private__ declaration of 'public_func' follows public declaration}}
template<typename T>
void public_func_template(); // expected-note{{previous declaration is here}}
template<typename T>
__module_private__ void public_func_template(); // expected-error{{__module_private__ declaration of 'public_func_template' follows public declaration}}
struct public_struct; // expected-note{{previous declaration is here}}
__module_private__ struct public_struct; // expected-error{{__module_private__ declaration of 'public_struct' follows public declaration}}
// Check for attempts to make specializations private
template<> __module_private__ void public_func_template<int>(); // expected-error{{template specialization cannot be declared __module_private__}}
template<typename T>
struct public_class {
struct inner_struct;
static int static_var;
friend __module_private__ void public_func_friend();
friend __module_private__ struct public_struct_friend;
};
template<> __module_private__ struct public_class<int>::inner_struct { }; // expected-error{{member specialization cannot be declared __module_private__}}
template<> __module_private__ int public_class<int>::static_var = 17; // expected-error{{member specialization cannot be declared __module_private__}}
template<>
__module_private__ struct public_class<float> { }; // expected-error{{template specialization cannot be declared __module_private__}}
template<typename T>
__module_private__ struct public_class<T *> { }; // expected-error{{partial specialization cannot be declared __module_private__}}
// Check for attempts to make parameters and variables with automatic
// storage module-private.
void local_var_private(__module_private__ int param) { // expected-error{{parameter 'param' cannot be declared __module_private__}}
__module_private__ struct Local { int x, y; } local; //expected-error{{local variable 'local' cannot be declared __module_private__}}
__module_private__ struct OtherLocal { int x; }; // expected-error{{local struct cannot be declared __module_private__}}
typedef __module_private__ int local_typedef; // expected-error{{typedef 'local_typedef' cannot be declared __module_private__}}
}
#endif
|