1 // REQUIRED_ARGS: -de
2 import imports.protectionimp;
3
4 alias TypeTuple(T...) = T;
5
6 private
7 {
localF()8 void localF() {}
9 class localC {}
10 struct localS {}
11 union localU {}
12 interface localI {}
13 enum localE { foo }
localMT()14 mixin template localMT() {}
15
localTC(T)16 class localTC(T) {}
localTS(T)17 struct localTS(T) {}
localTU(T)18 union localTU(T) {}
localTI(T)19 interface localTI(T) {}
localTF(T)20 void localTF(T)() {}
21 }
22
main()23 void main()
24 {
25 // Private non-template declarations
26 static assert(!__traits(compiles, privF()));
27 static assert(!__traits(compiles, privC));
28 static assert(!__traits(compiles, privS));
29 static assert(!__traits(compiles, privU));
30 static assert(!__traits(compiles, privI));
31 static assert(!__traits(compiles, privE));
32 static assert(!__traits(compiles, privMT));
33
34 // Private local non-template declarations.
35 static assert( __traits(compiles, localF()));
36 static assert( __traits(compiles, localC));
37 static assert( __traits(compiles, localS));
38 static assert( __traits(compiles, localU));
39 static assert( __traits(compiles, localI));
40 static assert( __traits(compiles, localE));
41 static assert( __traits(compiles, localMT));
42
43 // Private template declarations.
44 static assert(!__traits(compiles, privTF!int()));
45 static assert(!__traits(compiles, privTC!int));
46 static assert(!__traits(compiles, privTS!int));
47 static assert(!__traits(compiles, privTU!int));
48 static assert(!__traits(compiles, privTI!int));
49
50 // Private local template declarations.
51 static assert( __traits(compiles, localTF!int()));
52 static assert( __traits(compiles, localTC!int));
53 static assert( __traits(compiles, localTS!int));
54 static assert( __traits(compiles, localTU!int));
55 static assert( __traits(compiles, localTI!int));
56
57 // Public template function with private type parameters.
58 static assert(!__traits(compiles, publF!privC()));
59 static assert(!__traits(compiles, publF!privS()));
60 static assert(!__traits(compiles, publF!privU()));
61 static assert(!__traits(compiles, publF!privI()));
62 static assert(!__traits(compiles, publF!privE()));
63
64 // Public template function with private alias parameters.
65 static assert(!__traits(compiles, publFA!privC()));
66 static assert(!__traits(compiles, publFA!privS()));
67 static assert(!__traits(compiles, publFA!privU()));
68 static assert(!__traits(compiles, publFA!privI()));
69 static assert(!__traits(compiles, publFA!privE()));
70
71 // Private alias.
72 static assert(!__traits(compiles, privA));
73
74 // Public template mixin.
75 static assert( __traits(compiles, publMT));
76 }
77
78 /***************************************************/
79 // 14169
80
staticMap14169(alias fun,T...)81 template staticMap14169(alias fun, T...)
82 {
83 static if (T.length > 0)
84 alias staticMap14169 = TypeTuple!(fun!(T[0]), staticMap14169!(fun, T[1..$]));
85 else
86 alias staticMap14169 = TypeTuple!();
87 }
88
89 class C14169
90 {
InnerStruct(string NameS)91 private struct InnerStruct(string NameS)
92 {
93 alias Name = NameS;
94 }
95 alias DimensionNames = staticMap14169!(GetName14169, InnerStruct!"A");
96 }
97