diff options
author | William S Fulton <wsf@fultondesigns.co.uk> | 2013-02-18 08:40:20 +0000 |
---|---|---|
committer | William S Fulton <wsf@fultondesigns.co.uk> | 2013-02-18 22:40:42 +0000 |
commit | d1b40b468b607c4c71f424a1a2d36c5b240ca975 (patch) | |
tree | a3e106a41be7a0f60b4ba9bc292fb4ac35e1dfd1 | |
parent | 2435b98a24f0be0abee1573948bb5d1f20d4b711 (diff) | |
download | swig-d1b40b468b607c4c71f424a1a2d36c5b240ca975.tar.gz |
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.
-rw-r--r-- | Doc/Manual/Warnings.html | 2 | ||||
-rw-r--r-- | Examples/test-suite/errors/expected.log | 6 | ||||
-rw-r--r-- | Examples/test-suite/errors/swig_extend.i | 25 | ||||
-rw-r--r-- | Examples/test-suite/extend_constructor_destructor.i | 4 | ||||
-rw-r--r-- | Source/Include/swigwarn.h | 2 | ||||
-rw-r--r-- | Source/Modules/lang.cxx | 28 |
6 files changed, 65 insertions, 2 deletions
diff --git a/Doc/Manual/Warnings.html b/Doc/Manual/Warnings.html index ccb1751d5..cf4c38d7e 100644 --- a/Doc/Manual/Warnings.html +++ b/Doc/Manual/Warnings.html @@ -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> diff --git a/Examples/test-suite/errors/expected.log b/Examples/test-suite/errors/expected.log index d344d076b..2db3d8cbc 100644 --- a/Examples/test-suite/errors/expected.log +++ b/Examples/test-suite/errors/expected.log @@ -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. diff --git a/Examples/test-suite/errors/swig_extend.i b/Examples/test-suite/errors/swig_extend.i index ef0652320..3f8d9a787 100644 --- a/Examples/test-suite/errors/swig_extend.i +++ b/Examples/test-suite/errors/swig_extend.i @@ -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); } +} + diff --git a/Examples/test-suite/extend_constructor_destructor.i b/Examples/test-suite/extend_constructor_destructor.i index 95b48a6c5..c25b81b03 100644 --- a/Examples/test-suite/extend_constructor_destructor.i +++ b/Examples/test-suite/extend_constructor_destructor.i @@ -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; diff --git a/Source/Include/swigwarn.h b/Source/Include/swigwarn.h index a3fb31012..daf8b1791 100644 --- a/Source/Include/swigwarn.h +++ b/Source/Include/swigwarn.h @@ -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) -- */ diff --git a/Source/Modules/lang.cxx b/Source/Modules/lang.cxx index 69df79271..4d1cefc69 100644 --- a/Source/Modules/lang.cxx +++ b/Source/Modules/lang.cxx @@ -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); } |