Fix seg fault for global declarations declared erroneously without a name

This commit is contained in:
William S Fulton 2017-03-10 19:42:31 +00:00
commit b851e45e0a
3 changed files with 29 additions and 16 deletions

View file

@ -0,0 +1,6 @@
%module xxx
struct Funcs {};
short (Funcs::* *)(bool) = 0;
short (Funcs::* const*)(bool) = 0;

View file

@ -0,0 +1,2 @@
cpp_bad_global_memberptr.i:5: Error: Missing symbol name for global declaration
cpp_bad_global_memberptr.i:6: Error: Missing symbol name for global declaration

View file

@ -3040,8 +3040,9 @@ c_decl : storage_class type declarator initializer c_decl_tail {
Setattr($$,"bitfield", $4.bitfield); Setattr($$,"bitfield", $4.bitfield);
} }
if ($3.id) {
/* Look for "::" declarations (ignored) */ /* Look for "::" declarations (ignored) */
if (Strstr($3.id,"::")) { if (Strstr($3.id, "::")) {
/* This is a special case. If the scope name of the declaration exactly /* This is a special case. If the scope name of the declaration exactly
matches that of the declaration, then we will allow it. Otherwise, delete. */ matches that of the declaration, then we will allow it. Otherwise, delete. */
String *p = Swig_scopename_prefix($3.id); String *p = Swig_scopename_prefix($3.id);
@ -3049,9 +3050,9 @@ c_decl : storage_class type declarator initializer c_decl_tail {
if ((Namespaceprefix && Strcmp(p, Namespaceprefix) == 0) || if ((Namespaceprefix && Strcmp(p, Namespaceprefix) == 0) ||
(Classprefix && Strcmp(p, Classprefix) == 0)) { (Classprefix && Strcmp(p, Classprefix) == 0)) {
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($$,$5); set_nextSibling($$, $5);
} else { } else {
Delete($$); Delete($$);
$$ = $5; $$ = $5;
@ -3062,7 +3063,11 @@ c_decl : storage_class type declarator initializer c_decl_tail {
$$ = $5; $$ = $5;
} }
} else { } else {
set_nextSibling($$,$5); set_nextSibling($$, $5);
}
} else {
Swig_error(cparse_file, cparse_line, "Missing symbol name for global declaration\n");
$$ = 0;
} }
} }
/* Alternate function syntax introduced in C++11: /* Alternate function syntax introduced in C++11: