Extern template tweaks
Document extern template functions support. Extern templates result in new warning to differentiate from template explicit instantiation definition warning.
This commit is contained in:
parent
40b8416213
commit
017900d57e
8 changed files with 89 additions and 16 deletions
|
|
@ -7,6 +7,22 @@ the issue number to the end of the URL: https://github.com/swig/swig/issues/
|
||||||
Version 4.1.0 (in progress)
|
Version 4.1.0 (in progress)
|
||||||
===========================
|
===========================
|
||||||
|
|
||||||
|
2022-01-25: wsfulton
|
||||||
|
New warning 327 for extern templates, eg:
|
||||||
|
|
||||||
|
extern template class std::vector<int>;
|
||||||
|
extern template void Func<int>();
|
||||||
|
|
||||||
|
results in warning
|
||||||
|
|
||||||
|
example.i:3: Warning 327: Extern template ignored.
|
||||||
|
example.i:4: Warning 327: Extern template ignored.
|
||||||
|
|
||||||
|
Extern template classes previously resulted in warning 320.
|
||||||
|
|
||||||
|
2022-01-24: romintomasetti
|
||||||
|
#2131 #2157 C++11 extern function template parsing error fix.
|
||||||
|
|
||||||
2022-01-21: wsfulton
|
2022-01-21: wsfulton
|
||||||
#2120 #2138 Replace legacy PCRE dependency with PCRE2.
|
#2120 #2138 Replace legacy PCRE dependency with PCRE2.
|
||||||
This requires changes for building SWIG from source. See updated
|
This requires changes for building SWIG from source. See updated
|
||||||
|
|
|
||||||
|
|
@ -144,14 +144,39 @@ When either of these is used from a target language, a runtime call is made to o
|
||||||
<H3><a name="CPlusPlus11_extern_template">7.2.3 Extern template</a></H3>
|
<H3><a name="CPlusPlus11_extern_template">7.2.3 Extern template</a></H3>
|
||||||
|
|
||||||
|
|
||||||
<p>SWIG correctly parses the keywords <tt>extern template</tt>.
|
<p>SWIG correctly parses <tt>extern template</tt> explicit instantiation declarations.
|
||||||
However, this template instantiation suppression in a translation unit has no relevance outside of the C++ compiler and so is not used by SWIG.
|
However, this template instantiation suppression in a translation unit has no relevance outside of the C++ compiler and so is not used by SWIG.
|
||||||
SWIG only uses <tt>%template</tt> for instantiating and wrapping templates.</p>
|
SWIG only uses <tt>%template</tt> for instantiating and wrapping templates.
|
||||||
|
Consider the class template below:
|
||||||
|
</p>
|
||||||
|
|
||||||
<div class="code"><pre>
|
<div class="code"><pre>
|
||||||
template class std::vector<int>; // C++03 explicit instantiation in C++
|
// Class template
|
||||||
extern template class std::vector<int>; // C++11 explicit instantiation suppression in C++
|
template class std::vector<int>; // C++03 template explicit instantiation definition in C++
|
||||||
%template(VectorInt) std::vector<int>; // SWIG instantiation
|
extern template class std::vector<int>; // C++11 template explicit instantiation declaration (extern template)
|
||||||
|
%template(VectorInt) std::vector<int>; // SWIG template instantiation
|
||||||
|
</pre></div>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
The above result in warnings:
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<div class="shell">
|
||||||
|
<pre>
|
||||||
|
example.i:2: Warning 320: Explicit template instantiation ignored.
|
||||||
|
example.i:3: Warning 327: Extern template ignored.
|
||||||
|
</pre>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Similarly for the function template below:
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<div class="code"><pre>
|
||||||
|
// Function template
|
||||||
|
template void Func<int>(); // C++03 template explicit instantiation definition in C++
|
||||||
|
extern template void Func<int>(); // C++11 template explicit instantiation declaration (extern template)
|
||||||
|
%template(FuncInt) Func<int>; // SWIG template instantiation
|
||||||
</pre></div>
|
</pre></div>
|
||||||
|
|
||||||
<H3><a name="CPlusPlus11_initializer_lists">7.2.4 Initializer lists</a></H3>
|
<H3><a name="CPlusPlus11_initializer_lists">7.2.4 Initializer lists</a></H3>
|
||||||
|
|
|
||||||
|
|
@ -428,6 +428,7 @@ example.i(4) : Syntax error in input(1).
|
||||||
<li>324. Named nested template instantiations not supported. Processing as if no name was given to %template().
|
<li>324. Named nested template instantiations not supported. Processing as if no name was given to %template().
|
||||||
<li>325. Nested <em>kind</em> not currently supported (<em>name</em> ignored).
|
<li>325. Nested <em>kind</em> not currently supported (<em>name</em> ignored).
|
||||||
<li>326. Deprecated %extend name used - the <em>kind</em> name '<em>name</em>' should be used instead of the typedef name '<em>name</em>'.
|
<li>326. Deprecated %extend name used - the <em>kind</em> name '<em>name</em>' should be used instead of the typedef name '<em>name</em>'.
|
||||||
|
<li>327. Extern template ignored.
|
||||||
<li>350. operator new ignored.
|
<li>350. operator new ignored.
|
||||||
<li>351. operator delete ignored.
|
<li>351. operator delete ignored.
|
||||||
<li>352. operator+ ignored.
|
<li>352. operator+ ignored.
|
||||||
|
|
|
||||||
|
|
@ -4,8 +4,9 @@
|
||||||
*/
|
*/
|
||||||
%module cpp11_template_explicit
|
%module cpp11_template_explicit
|
||||||
|
|
||||||
/* Explicitely silence SWIG warning related to explicit templates */
|
/* Suppress SWIG warnings related to explicit template instantiation and extern templates */
|
||||||
#pragma SWIG nowarn=SWIGWARN_PARSE_EXPLICIT_TEMPLATE
|
#pragma SWIG nowarn=SWIGWARN_PARSE_EXPLICIT_TEMPLATE
|
||||||
|
#pragma SWIG nowarn=SWIGWARN_PARSE_EXTERN_TEMPLATE
|
||||||
|
|
||||||
%inline %{
|
%inline %{
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,24 @@
|
||||||
|
%module xxx
|
||||||
|
|
||||||
|
%inline %{
|
||||||
|
namespace std {
|
||||||
|
template<typename T> class vector {};
|
||||||
|
}
|
||||||
|
template<typename T> void Func() {}
|
||||||
|
%}
|
||||||
|
|
||||||
|
%inline %{
|
||||||
|
// Class template
|
||||||
|
template class std::vector<int>; // C++03 template explicit instantiation definition in C++
|
||||||
|
extern template class std::vector<int>; // C++11 template explicit instantiation declaration (extern template)
|
||||||
|
%}
|
||||||
|
%template(VectorInt) std::vector<int>; // SWIG template instantiation
|
||||||
|
|
||||||
|
%inline %{
|
||||||
|
// Function template
|
||||||
|
template void Func<int>(); // C++03 template explicit instantiation definition in C++
|
||||||
|
extern template void Func<int>(); // C++11 template explicit instantiation declaration (extern template)
|
||||||
|
%}
|
||||||
|
%template(FuncInt) Func<int>; // SWIG template instantiation
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -0,0 +1,4 @@
|
||||||
|
cpp_template_explicit_instantiation.i:12: Warning 320: Explicit template instantiation ignored.
|
||||||
|
cpp_template_explicit_instantiation.i:13: Warning 327: Extern template ignored.
|
||||||
|
cpp_template_explicit_instantiation.i:19: Warning 320: Explicit template instantiation ignored.
|
||||||
|
cpp_template_explicit_instantiation.i:20: Warning 327: Extern template ignored.
|
||||||
|
|
@ -4355,26 +4355,27 @@ cpp_template_decl : TEMPLATE LESSTHAN template_parms GREATERTHAN {
|
||||||
parsing_template_declaration = 0;
|
parsing_template_declaration = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Explicit template instantiation */
|
/* Class template explicit instantiation definition */
|
||||||
| TEMPLATE cpptype idcolon {
|
| TEMPLATE cpptype idcolon {
|
||||||
Swig_warning(WARN_PARSE_EXPLICIT_TEMPLATE, cparse_file, cparse_line, "Explicit template instantiation ignored.\n");
|
Swig_warning(WARN_PARSE_EXPLICIT_TEMPLATE, cparse_file, cparse_line, "Explicit template instantiation ignored.\n");
|
||||||
$$ = 0;
|
$$ = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Explicit function template instantiation */
|
/* Function template explicit instantiation definition */
|
||||||
| TEMPLATE cpp_alternate_rettype idcolon LPAREN parms RPAREN {
|
| TEMPLATE cpp_alternate_rettype idcolon LPAREN parms RPAREN {
|
||||||
Swig_warning(WARN_PARSE_EXPLICIT_TEMPLATE, cparse_file, cparse_line, "Explicit function template instantiation ignored.\n");
|
Swig_warning(WARN_PARSE_EXPLICIT_TEMPLATE, cparse_file, cparse_line, "Explicit template instantiation ignored.\n");
|
||||||
$$ = 0;
|
$$ = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Explicit class template instantiation without the translation unit */
|
/* Class template explicit instantiation declaration (extern template) */
|
||||||
| EXTERN TEMPLATE cpptype idcolon {
|
| EXTERN TEMPLATE cpptype idcolon {
|
||||||
Swig_warning(WARN_PARSE_EXPLICIT_TEMPLATE, cparse_file, cparse_line, "Explicit (extern) class template instantiation ignored.\n");
|
Swig_warning(WARN_PARSE_EXTERN_TEMPLATE, cparse_file, cparse_line, "Extern template ignored.\n");
|
||||||
$$ = 0;
|
$$ = 0;
|
||||||
}
|
}
|
||||||
/* Explicit function template instantiation without the translation unit */
|
|
||||||
|
/* Function template explicit instantiation declaration (extern template) */
|
||||||
| EXTERN TEMPLATE cpp_alternate_rettype idcolon LPAREN parms RPAREN {
|
| EXTERN TEMPLATE cpp_alternate_rettype idcolon LPAREN parms RPAREN {
|
||||||
Swig_warning(WARN_PARSE_EXPLICIT_TEMPLATE, cparse_file, cparse_line, "Explicit (extern) function template instantiation ignored.\n");
|
Swig_warning(WARN_PARSE_EXTERN_TEMPLATE, cparse_file, cparse_line, "Extern template ignored.\n");
|
||||||
$$ = 0;
|
$$ = 0;
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
|
||||||
|
|
@ -93,6 +93,7 @@
|
||||||
#define WARN_PARSE_NESTED_TEMPLATE 324
|
#define WARN_PARSE_NESTED_TEMPLATE 324
|
||||||
#define WARN_PARSE_NAMED_NESTED_CLASS 325
|
#define WARN_PARSE_NAMED_NESTED_CLASS 325
|
||||||
#define WARN_PARSE_EXTEND_NAME 326
|
#define WARN_PARSE_EXTEND_NAME 326
|
||||||
|
#define WARN_PARSE_EXTERN_TEMPLATE 327
|
||||||
|
|
||||||
#define WARN_CPP11_LAMBDA 340
|
#define WARN_CPP11_LAMBDA 340
|
||||||
#define WARN_CPP11_ALIAS_DECLARATION 341 /* redundant now */
|
#define WARN_CPP11_ALIAS_DECLARATION 341 /* redundant now */
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue