summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWilliam S Fulton <wsf@fultondesigns.co.uk>2013-02-18 08:40:20 +0000
committerWilliam S Fulton <wsf@fultondesigns.co.uk>2013-02-18 22:40:42 +0000
commitd1b40b468b607c4c71f424a1a2d36c5b240ca975 (patch)
treea3e106a41be7a0f60b4ba9bc292fb4ac35e1dfd1
parent2435b98a24f0be0abee1573948bb5d1f20d4b711 (diff)
downloadswig-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.html2
-rw-r--r--Examples/test-suite/errors/expected.log6
-rw-r--r--Examples/test-suite/errors/swig_extend.i25
-rw-r--r--Examples/test-suite/extend_constructor_destructor.i4
-rw-r--r--Source/Include/swigwarn.h2
-rw-r--r--Source/Modules/lang.cxx28
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);
}