mirror of https://github.com/swig/swig
Fix C code where a typedef name was used for constructor and destructor names in %extend. Deprecate use of typedef names for constructor and destructor names going forwards.
This commit is contained in:
parent
2435b98a24
commit
d1b40b468b
|
@ -527,6 +527,8 @@ example.i(4) : Syntax error in input.
|
|||
<li>519. %template() contains no name. Template method ignored: <em>declaration</em>
|
||||
<li>520. <em>Base/Derived</em> class '<em>classname1</em>' of '<em>classname2</em>' is not similarly marked as a smart pointer.
|
||||
<li>521. Illegal destructor name <em>name</em>. Ignored.
|
||||
<li>522. Use of an illegal constructor name '<em>name</em>' in %extend is deprecated, the constructor name should be '<em>name</em>'.
|
||||
<li>523. Use of an illegal destructor name '<em>name</em>' in %extend is deprecated, the destructor name should be '<em>name</em>'.
|
||||
</ul>
|
||||
|
||||
<H3><a name="Warnings_nn15"></a>14.9.6 Language module specific (700-899) </H3>
|
||||
|
|
|
@ -190,7 +190,13 @@ swig_apply_nargs.i:6: Error: Can't apply (char *str,int len) to (int x). Number
|
|||
|
||||
:::::::::::::::::::::::::::::::: swig_extend.i :::::::::::::::::::::::::::::::::::
|
||||
swig_extend.i:19: Warning 326: Deprecated %extend name used - the struct name 'StructBName' should be used instead of the typedef name 'StructB'.
|
||||
swig_extend.i:45: Warning 326: Deprecated %extend name used - the struct name 'stru_struct' should be used instead of the typedef name 'stru'.
|
||||
swig_extend.i:56: Warning 326: Deprecated %extend name used - the union name 'uni_union' should be used instead of the typedef name 'uni'.
|
||||
swig_extend.i:34: Warning 303: %extend defined for an undeclared class StructDName.
|
||||
swig_extend.i:50: Warning 522: Use of an illegal constructor name 'stru' in %extend is deprecated, the constructor name should be 'stru_struct'.
|
||||
swig_extend.i:53: Warning 523: Use of an illegal destructor name 'stru' in %extend is deprecated, the destructor name should be 'stru_struct'.
|
||||
swig_extend.i:57: Warning 522: Use of an illegal constructor name 'uni' in %extend is deprecated, the constructor name should be 'uni_union'.
|
||||
swig_extend.i:58: Warning 523: Use of an illegal destructor name 'uni' in %extend is deprecated, the destructor name should be 'uni_union'.
|
||||
|
||||
:::::::::::::::::::::::::::::::: swig_identifier.i :::::::::::::::::::::::::::::::::::
|
||||
swig_identifier.i:5: Warning 503: Can't wrap 'foo bar' unless renamed to a valid identifier.
|
||||
|
|
|
@ -33,3 +33,28 @@ typedef struct StructD StructDName;
|
|||
void method() {}
|
||||
}
|
||||
|
||||
|
||||
typedef struct stru_struct {
|
||||
int bar;
|
||||
} stru;
|
||||
typedef union uni_union {
|
||||
int un1;
|
||||
double un2;
|
||||
} uni;
|
||||
|
||||
%extend stru {
|
||||
stru() {
|
||||
stru* s = (stru*)malloc(sizeof(stru));
|
||||
s->bar = 11;
|
||||
return s;
|
||||
}
|
||||
~stru() {
|
||||
free($self);
|
||||
}
|
||||
}
|
||||
|
||||
%extend uni {
|
||||
uni() { return 0; }
|
||||
~uni() { free($self); }
|
||||
}
|
||||
|
||||
|
|
|
@ -2,6 +2,10 @@
|
|||
|
||||
%warnfilter(SWIGWARN_PARSE_EXTEND_NAME) Space::tagCStruct;
|
||||
%warnfilter(SWIGWARN_PARSE_EXTEND_NAME) tagEStruct;
|
||||
%warnfilter(SWIGWARN_LANG_EXTEND_CONSTRUCTOR) Space::tagCStruct::CStruct;
|
||||
%warnfilter(SWIGWARN_LANG_EXTEND_DESTRUCTOR) Space::tagCStruct::~CStruct;
|
||||
%warnfilter(SWIGWARN_LANG_EXTEND_CONSTRUCTOR) tagEStruct::EStruct;
|
||||
%warnfilter(SWIGWARN_LANG_EXTEND_DESTRUCTOR) tagEStruct::~EStruct;
|
||||
|
||||
%inline %{
|
||||
int globalVar = 0;
|
||||
|
|
|
@ -197,6 +197,8 @@
|
|||
#define WARN_LANG_TEMPLATE_METHOD_IGNORE 519
|
||||
#define WARN_LANG_SMARTPTR_MISSING 520
|
||||
#define WARN_LANG_ILLEGAL_DESTRUCTOR 521
|
||||
#define WARN_LANG_EXTEND_CONSTRUCTOR 522
|
||||
#define WARN_LANG_EXTEND_DESTRUCTOR 523
|
||||
|
||||
/* -- Reserved (600-799) -- */
|
||||
|
||||
|
|
|
@ -2631,10 +2631,22 @@ int Language::constructorDeclaration(Node *n) {
|
|||
if (!Equal(actual_name, expected_name) && !(Getattr(n, "template"))) {
|
||||
bool illegal_name = true;
|
||||
if (Extend) {
|
||||
// SWIG extension - allow typedef names as destructor name in %extend - an unnamed struct declared with a typedef can thus be given a 'destructor'.
|
||||
// Check for typedef names used as a constructor name in %extend. This is deprecated except for anonymous
|
||||
// typedef structs which have had their symbol names adjusted to the typedef name in the parser.
|
||||
SwigType *name_resolved = SwigType_typedef_resolve_all(actual_name);
|
||||
SwigType *expected_name_resolved = SwigType_typedef_resolve_all(expected_name);
|
||||
|
||||
if (!CPlusPlus) {
|
||||
if (Strncmp(name_resolved, "struct ", 7) == 0)
|
||||
Replace(name_resolved, "struct ", "", DOH_REPLACE_FIRST);
|
||||
else if (Strncmp(name_resolved, "union ", 6) == 0)
|
||||
Replace(name_resolved, "union ", "", DOH_REPLACE_FIRST);
|
||||
}
|
||||
|
||||
illegal_name = !Equal(name_resolved, expected_name_resolved);
|
||||
if (!illegal_name)
|
||||
Swig_warning(WARN_LANG_EXTEND_CONSTRUCTOR, input_file, line_number, "Use of an illegal constructor name '%s' in %%extend is deprecated, the constructor name should be '%s'.\n",
|
||||
SwigType_str(Swig_scopename_last(actual_name), 0), SwigType_str(Swig_scopename_last(expected_name), 0));
|
||||
Delete(name_resolved);
|
||||
Delete(expected_name_resolved);
|
||||
}
|
||||
|
@ -2770,10 +2782,22 @@ int Language::destructorDeclaration(Node *n) {
|
|||
if (!Equal(actual_name, expected_name) && !(Getattr(n, "template"))) {
|
||||
bool illegal_name = true;
|
||||
if (Extend) {
|
||||
// SWIG extension - allow typedef names as destructor name in %extend - an unnamed struct declared with a typedef can thus be given a 'destructor'.
|
||||
// Check for typedef names used as a destructor name in %extend. This is deprecated except for anonymous
|
||||
// typedef structs which have had their symbol names adjusted to the typedef name in the parser.
|
||||
SwigType *name_resolved = SwigType_typedef_resolve_all(actual_name);
|
||||
SwigType *expected_name_resolved = SwigType_typedef_resolve_all(expected_name);
|
||||
|
||||
if (!CPlusPlus) {
|
||||
if (Strncmp(name_resolved, "struct ", 7) == 0)
|
||||
Replace(name_resolved, "struct ", "", DOH_REPLACE_FIRST);
|
||||
else if (Strncmp(name_resolved, "union ", 6) == 0)
|
||||
Replace(name_resolved, "union ", "", DOH_REPLACE_FIRST);
|
||||
}
|
||||
|
||||
illegal_name = !Equal(name_resolved, expected_name_resolved);
|
||||
if (!illegal_name)
|
||||
Swig_warning(WARN_LANG_EXTEND_DESTRUCTOR, input_file, line_number, "Use of an illegal destructor name '%s' in %%extend is deprecated, the destructor name should be '%s'.\n",
|
||||
SwigType_str(Swig_scopename_last(actual_name), 0), SwigType_str(Swig_scopename_last(expected_name), 0));
|
||||
Delete(name_resolved);
|
||||
Delete(expected_name_resolved);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue