C++11 alternate syntax for function declarations improvements

Functions can now be declared const/noexcept/final etc
This commit is contained in:
William S Fulton 2017-03-06 21:06:51 +00:00
commit 0ccef1424a
3 changed files with 38 additions and 27 deletions

View file

@ -6,13 +6,15 @@
struct SomeStruct { struct SomeStruct {
int addNormal(int x, int y); int addNormal(int x, int y);
auto addAlternate(int x, int y) -> int; auto addAlternate(int x, int y) -> int;
auto addAlternateConst(int x, int y) const -> int;
auto addAlternateNoExcept(int x, int y) noexcept -> int;
auto addAlternateConstNoExcept(int x, int y) const noexcept -> int;
}; };
auto SomeStruct::addAlternate(int x, int y) -> int { int SomeStruct::addNormal(int x, int y) { return x + y; }
return x + y; auto SomeStruct::addAlternate(int x, int y) -> int { return x + y; }
} auto SomeStruct::addAlternateConst(int x, int y) const -> int { return x + y; }
auto SomeStruct::addAlternateNoExcept(int x, int y) noexcept -> int { return x + y; }
auto SomeStruct::addAlternateConstNoExcept(int x, int y) const noexcept -> int { return x + y; }
int SomeStruct::addNormal(int x, int y) {
return x + y;
}
%} %}

View file

@ -4,11 +4,20 @@ a = cpp11_alternate_function_syntax.SomeStruct()
res = a.addNormal(4, 5) res = a.addNormal(4, 5)
if res != 9: if res != 9:
raise RuntimeError, ("SomeStruct::addNormal(4,5) returns ", raise RuntimeError, ("SomeStruct::addNormal(4,5) returns ", res, " should be 9.")
res, " should be 9.")
res = a.addAlternate(4, 5) res = a.addAlternate(4, 5)
if res != 9: if res != 9:
raise RuntimeError, ("SomeStruct::addAlternate(4,5) returns ", raise RuntimeError, ("SomeStruct::addAlternate(4,5) returns ", res, " should be 9.")
res, " should be 9.")
res = a.addAlternateConst(4, 5)
if res != 9:
raise RuntimeError, ("SomeStruct::addAlternateConst(4,5) returns ", res, " should be 9.")
res = a.addAlternateNoExcept(4, 5)
if res != 9:
raise RuntimeError, ("SomeStruct::addAlternateNoExcept(4,5) returns ", res, " should be 9.")
res = a.addAlternateConstNoExcept(4, 5)
if res != 9:
raise RuntimeError, ("SomeStruct::addAlternateConstNoExcept(4,5) returns ", res, " should be 9.")

View file

@ -3067,36 +3067,36 @@ c_decl : storage_class type declarator initializer c_decl_tail {
} }
/* Alternate function syntax introduced in C++11: /* Alternate function syntax introduced in C++11:
auto funcName(int x, int y) -> int; */ auto funcName(int x, int y) -> int; */
| storage_class AUTO declarator ARROW cpp_alternate_rettype initializer c_decl_tail { | storage_class AUTO declarator cpp_const ARROW cpp_alternate_rettype initializer c_decl_tail {
$$ = new_node("cdecl"); $$ = new_node("cdecl");
if ($6.qualifier) SwigType_push($3.type,$6.qualifier); if ($4.qualifier) SwigType_push($3.type, $4.qualifier);
Setattr($$,"type",$5); Setattr($$,"type",$6);
Setattr($$,"storage",$1); Setattr($$,"storage",$1);
Setattr($$,"name",$3.id); Setattr($$,"name",$3.id);
Setattr($$,"decl",$3.type); Setattr($$,"decl",$3.type);
Setattr($$,"parms",$3.parms); Setattr($$,"parms",$3.parms);
Setattr($$,"value",$6.val); Setattr($$,"value",$4.val);
Setattr($$,"throws",$6.throws); Setattr($$,"throws",$4.throws);
Setattr($$,"throw",$6.throwf); Setattr($$,"throw",$4.throwf);
Setattr($$,"noexcept",$6.nexcept); Setattr($$,"noexcept",$4.nexcept);
if (!$7) { if (!$8) {
if (Len(scanner_ccode)) { if (Len(scanner_ccode)) {
String *code = Copy(scanner_ccode); String *code = Copy(scanner_ccode);
Setattr($$,"code",code); Setattr($$,"code",code);
Delete(code); Delete(code);
} }
} else { } else {
Node *n = $7; Node *n = $8;
while (n) { while (n) {
String *type = Copy($5); String *type = Copy($6);
Setattr(n,"type",type); Setattr(n,"type",type);
Setattr(n,"storage",$1); Setattr(n,"storage",$1);
n = nextSibling(n); n = nextSibling(n);
Delete(type); Delete(type);
} }
} }
if ($6.bitfield) { if ($4.bitfield) {
Setattr($$,"bitfield", $6.bitfield); Setattr($$,"bitfield", $4.bitfield);
} }
if (Strstr($3.id,"::")) { if (Strstr($3.id,"::")) {
@ -3107,18 +3107,18 @@ c_decl : storage_class type declarator initializer c_decl_tail {
String *lstr = Swig_scopename_last($3.id); String *lstr = Swig_scopename_last($3.id);
Setattr($$,"name",lstr); Setattr($$,"name",lstr);
Delete(lstr); Delete(lstr);
set_nextSibling($$,$7); set_nextSibling($$, $8);
} else { } else {
Delete($$); Delete($$);
$$ = $7; $$ = $8;
} }
Delete(p); Delete(p);
} else { } else {
Delete($$); Delete($$);
$$ = $7; $$ = $8;
} }
} else { } else {
set_nextSibling($$,$7); set_nextSibling($$, $8);
} }
} }
; ;