diff options
author | Olly Betts <olly@survex.com> | 2022-01-30 11:06:07 +1300 |
---|---|---|
committer | Olly Betts <olly@survex.com> | 2022-01-30 11:06:37 +1300 |
commit | 7b5a615e50548ab9c512b384a8f0b8d56bc45bd1 (patch) | |
tree | 46b1e53974d7b3e483c0a4329f9c724a03158d57 | |
parent | d2d2bfa05f928d74d546427c70c10c3f08895738 (diff) | |
parent | d9ced1e56dca52737b280577ff944d63e5267c24 (diff) | |
download | swig-7b5a615e50548ab9c512b384a8f0b8d56bc45bd1.tar.gz |
Merge branch 'fschlimb/using-fixes'
Fixes #655
Fixes #1488
-rw-r--r-- | Examples/test-suite/common.mk | 1 | ||||
-rw-r--r-- | Examples/test-suite/python/using_member_runme.py | 10 | ||||
-rw-r--r-- | Examples/test-suite/using_member.i | 50 | ||||
-rw-r--r-- | Source/CParse/parser.y | 5 | ||||
-rw-r--r-- | Source/Swig/swig.h | 1 | ||||
-rw-r--r-- | Source/Swig/symbol.c | 37 |
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); |