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