summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOlly Betts <olly@survex.com>2022-01-30 11:06:07 +1300
committerOlly Betts <olly@survex.com>2022-01-30 11:06:37 +1300
commit7b5a615e50548ab9c512b384a8f0b8d56bc45bd1 (patch)
tree46b1e53974d7b3e483c0a4329f9c724a03158d57
parentd2d2bfa05f928d74d546427c70c10c3f08895738 (diff)
parentd9ced1e56dca52737b280577ff944d63e5267c24 (diff)
downloadswig-7b5a615e50548ab9c512b384a8f0b8d56bc45bd1.tar.gz
Merge branch 'fschlimb/using-fixes'
Fixes #655 Fixes #1488
-rw-r--r--Examples/test-suite/common.mk1
-rw-r--r--Examples/test-suite/python/using_member_runme.py10
-rw-r--r--Examples/test-suite/using_member.i50
-rw-r--r--Source/CParse/parser.y5
-rw-r--r--Source/Swig/swig.h1
-rw-r--r--Source/Swig/symbol.c37
6 files changed, 101 insertions, 3 deletions
diff --git a/Examples/test-suite/common.mk b/Examples/test-suite/common.mk
index 19e5d170c..86f052de5 100644
--- a/Examples/test-suite/common.mk
+++ b/Examples/test-suite/common.mk
@@ -549,6 +549,7 @@ CPP_TEST_CASES += \
using_directive_and_declaration_forward \
using_extend \
using_inherit \
+ using_member \
using_namespace \
using_namespace_loop \
using_pointers \
diff --git a/Examples/test-suite/python/using_member_runme.py b/Examples/test-suite/python/using_member_runme.py
new file mode 100644
index 000000000..a666059e2
--- /dev/null
+++ b/Examples/test-suite/python/using_member_runme.py
@@ -0,0 +1,10 @@
+from using_member import *
+
+b = B()
+assert b.get(int(1)) == 10
+assert b.get(float(1)) == 20
+
+bb = BB()
+assert bb.greater(int(1)) == 0
+assert bb.greater(float(1)) == 1
+assert bb.great(True) == 2
diff --git a/Examples/test-suite/using_member.i b/Examples/test-suite/using_member.i
new file mode 100644
index 000000000..3d00622c4
--- /dev/null
+++ b/Examples/test-suite/using_member.i
@@ -0,0 +1,50 @@
+%module using_member
+
+%rename(greater) one::two::three::interface1::AA::great(int);
+%rename(greater) one::two::three::interface1::AA::great(float);
+
+%inline %{
+namespace interface1
+{
+ struct A
+ {
+ int get(int) {return 10;}
+ };
+}
+using interface1::A;
+
+struct B : public A
+{
+ using A::get;
+ int get(double) {return 20;}
+};
+
+
+namespace one {
+ namespace two {
+ namespace three {
+ namespace interface1
+ {
+ class AA
+ {
+ public:
+ int great(int) {return 0;}
+ int great(float) {return 1;}
+ };
+ }
+ using interface1::AA;
+ }
+ }
+ namespace twotwo {
+ namespace threetwo {
+ class BB : public two::three::AA
+ {
+ public:
+ using two::three::AA::great;
+ int great(bool) {return 2;}
+ int jj() {return 3;}
+ };
+ }
+ }
+}
+%}
diff --git a/Source/CParse/parser.y b/Source/CParse/parser.y
index dfbfa43b6..aafec5cbb 100644
--- a/Source/CParse/parser.y
+++ b/Source/CParse/parser.y
@@ -4468,11 +4468,12 @@ templateparameterstail : COMMA templateparameter templateparameterstail {
/* Namespace support */
cpp_using_decl : USING idcolon SEMI {
- String *uname = Swig_symbol_type_qualify($2,0);
+ String *uname = Swig_symbol_type_qualify($2,0);
String *name = Swig_scopename_last($2);
- $$ = new_node("using");
+ $$ = new_node("using");
Setattr($$,"uname",uname);
Setattr($$,"name", name);
+ Swig_symbol_add_using(name, uname, $$);
Delete(uname);
Delete(name);
add_symbols($$);
diff --git a/Source/Swig/swig.h b/Source/Swig/swig.h
index 76691269e..9f7b2cbca 100644
--- a/Source/Swig/swig.h
+++ b/Source/Swig/swig.h
@@ -221,6 +221,7 @@ extern "C" {
extern void Swig_symbol_print_tables_summary(void);
extern void Swig_symbol_print_symbols(void);
extern void Swig_symbol_print_csymbols(void);
+ extern void Swig_symbol_add_using(String *name, String *uname, Node *n);
extern void Swig_symbol_init(void);
extern void Swig_symbol_setscopename(const_String_or_char_ptr name);
extern String *Swig_symbol_getscopename(void);
diff --git a/Source/Swig/symbol.c b/Source/Swig/symbol.c
index aacaf24be..66c73ae02 100644
--- a/Source/Swig/symbol.c
+++ b/Source/Swig/symbol.c
@@ -383,6 +383,29 @@ String *Swig_symbol_qualified_language_scopename(Symtab *n) {
}
/* -----------------------------------------------------------------------------
+ * Swig_symbol_add_using()
+ *
+ * Adds a node to the C symbol table for a using declaration.
+ * Used for using-declarations within classes/structs.
+ * ----------------------------------------------------------------------------- */
+
+void Swig_symbol_add_using(String *name, String *uname, Node *n) {
+ Hash *h;
+ h = Swig_symbol_clookup(uname, 0);
+ if (h && (checkAttribute(h, "kind", "class") || checkAttribute(h, "kind", "struct"))) {
+ String *qcurrent = Swig_symbol_qualifiedscopename(0);
+ if (qcurrent) {
+ Append(qcurrent, "::");
+ Append(qcurrent, name);
+ } else {
+ qcurrent = NewString(name);
+ }
+ Setattr(symtabs, qcurrent, n);
+ Delete(qcurrent);
+ }
+}
+
+/* -----------------------------------------------------------------------------
* Swig_symbol_newscope()
*
* Create a new scope. Returns the newly created scope.
@@ -1074,7 +1097,19 @@ static Node *symbol_lookup_qualified(const_String_or_char_ptr name, Symtab *symt
Delete(qalloc);
return st;
}
- n = symbol_lookup(name, st, checkfunc);
+ if (checkAttribute(st, "nodeType", "using")) {
+ String *uname = Getattr(st, "uname");
+ if (uname) {
+ st = Getattr(symtabs, uname);
+ if (st) {
+ n = symbol_lookup(name, st, checkfunc);
+ } else {
+ fprintf(stderr, "Error: Found corrupt 'using' node\n");
+ }
+ }
+ } else if (Getattr(st, "csymtab")) {
+ n = symbol_lookup(name, st, checkfunc);
+ }
}
if (qalloc)
Delete(qalloc);