summaryrefslogtreecommitdiff
path: root/Examples/test-suite/template_using_directive_and_declaration_forward.i
blob: dcc1d6ab4ecfdf1d5f2057aba4424dccda8bdbc1 (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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
%module template_using_directive_and_declaration_forward
// Test using directives combined with using declarations and forward declarations (templates)

%inline %{
namespace Outer1 {
  namespace Space1 {
    template<typename T> class Thing1;
  }
}
using namespace Outer1::Space1;
using Outer1::Space1::Thing1;
#ifdef __clang__
namespace Outer1 {
  namespace Space1 {
    template<typename T> class Thing1 {};
  }
}
#else
template<typename T> class Thing1 {};
#endif
void useit1(Thing1<int> t) {}
void useit1a(Outer1::Space1::Thing1<int> t) {}
void useit1b(::Outer1::Space1::Thing1<int> t) {}
namespace Outer1 {
  void useit1c(Space1::Thing1<int> t) {}
}


namespace Outer2 {
  namespace Space2 {
    template<typename T> class Thing2;
  }
}
using namespace Outer2;
using Space2::Thing2;
#ifdef __clang__
namespace Outer2 {
  namespace Space2 {
    template<typename T> class Thing2 {};
  }
}
#else
template<typename T> class Thing2 {};
#endif
void useit2(Thing2<int> t) {}
void useit2a(Outer2::Space2::Thing2<int> t) {}
void useit2b(::Outer2::Space2::Thing2<int> t) {}
void useit2c(Space2::Thing2<int> t) {}
namespace Outer2 {
  void useit2d(Space2::Thing2<int> t) {}
}


namespace Outer3 {
  namespace Space3 {
    namespace Middle3 {
      template<typename T> class Thing3;
    }
  }
}
using namespace Outer3;
using namespace Space3;
using Middle3::Thing3;
#ifdef __clang__
namespace Outer3 {
  namespace Space3 {
    namespace Middle3 {
      template<typename T> class Thing3 {};
    }
  }
}
#else
template<typename T> class Thing3 {};
#endif
void useit3(Thing3<int> t) {}
void useit3a(Outer3::Space3::Middle3::Thing3<int> t) {}
void useit3b(::Outer3::Space3::Middle3::Thing3<int> t) {}
void useit3c(Middle3::Thing3<int> t) {}
namespace Outer3 {
  namespace Space3 {
    void useit3d(Middle3::Thing3<int> t) {}
  }
}


namespace Outer4 {
  namespace Space4 {
    namespace Middle4 {
      template<typename T> class Thing4;
    }
  }
}
using namespace Outer4::Space4;
using Middle4::Thing4;
#ifdef __clang__
namespace Outer4 {
  namespace Space4 {
    namespace Middle4 {
      template<typename T> class Thing4 {};
    }
  }
}
#else
template<typename T> class Thing4 {};
#endif
void useit4(Thing4<int> t) {}
void useit4a(Outer4::Space4::Middle4::Thing4<int> t) {}
void useit4b(::Outer4::Space4::Middle4::Thing4<int> t) {}
void useit4c(Middle4::Thing4<int> t) {}
namespace Outer4 {
  namespace Space4 {
    void useit4d(Middle4::Thing4<int> t) {}
  }
}


namespace Outer5 {
  namespace Space5 {
    namespace Middle5 {
      namespace More5 {
        template<typename T> class Thing5;
      }
    }
  }
}
using namespace ::Outer5::Space5;
using namespace Middle5;
using More5::Thing5;
#ifdef __clang__
namespace Outer5 {
  namespace Space5 {
    namespace Middle5 {
      namespace More5 {
	template<typename T> class Thing5 {};
      }
    }
  }
}
#else
template<typename T> class Thing5 {};
#endif
void useit5(Thing5<int> t) {}
void useit5a(Outer5::Space5::Middle5::More5::Thing5<int> t) {}
void useit5b(::Outer5::Space5::Middle5::More5::Thing5<int> t) {}
void useit5c(Middle5::More5::Thing5<int> t) {}
namespace Outer5 {
  namespace Space5 {
    void useit5d(Middle5::More5::Thing5<int> t) {}
  }
}

namespace Outer7 {
  namespace Space7 {
    namespace Middle7 {
      template<typename T> class Thing7;
    }
  }
}
using namespace Outer7::Space7;
#ifdef __clang__
namespace Outer7 {
  namespace Space7 {
    namespace Middle7 {
      template<typename T> class Thing7 {};
    }
  }
}
#else
template<typename T> class Middle7::Thing7 {};
#endif
using Middle7::Thing7;
void useit7(Thing7<int> t) {}
void useit7a(Outer7::Space7::Middle7::Thing7<int> t) {}
void useit7b(::Outer7::Space7::Middle7::Thing7<int> t) {}
void useit7c(Middle7::Thing7<int> t) {}
namespace Outer7 {
  namespace Space7 {
    void useit7d(Middle7::Thing7<int> t) {}
  }
}

%}

%template(Thing1Int) Thing1<int>;
%template(Thing2Int) Thing2<int>;
%template(Thing3Int) Thing3<int>;
%template(Thing4Int) Thing4<int>;
%template(Thing5Int) Thing5<int>;
%template(Thing7Int) Thing7<int>;