The function get_hole_symbol is supposed to set *addrp to either true
or false. However it was only setting it to false, causing
uninitialized memory.
This patch also removes a gcc_asser tfrom a68_make_formal_hole_decl.
If the formal hole results in an empty symbol then it may result into
invalid assembly being generated, but that is akin to use an invalid
asm template.
Signed-off-by: Jose E. Marchesi <jemarch@gnu.org>
gcc/algol68/ChangeLog
PR algol68/124115
* a68-low-holes.cc (get_hole_symbol): Always set *addrp to avoid
uninitialized memory.
* a68-low.cc (a68_make_formal_hole_decl): Remove assert.
gcc/testsuite/ChangeLog
PR algol68/124115
* algol68/compile/formal-hole-2.a68: New test.
gcc_assert (IS (str, ROW_CHAR_DENOTATION));
const char *cstr = NSYMBOL (str);
- if (strlen (cstr) > 0 && cstr[0] == '&' && addrp != NULL)
+ bool isaddr = false;
+ if (strlen (cstr) > 0 && cstr[0] == '&')
{
- *addrp = true;
+ isaddr = true;
cstr = cstr + 1;
}
+ if (addrp != NULL)
+ *addrp = isaddr;
return a68_string_process_breaks (p, cstr);
}
? TREE_TYPE (CTYPE (MOID (p)))
: CTYPE (MOID (p)));
- gcc_assert (strlen (extern_symbol) > 0);
- const char *sym = (extern_symbol[0] == '&'
+ const char *sym = (strlen (extern_symbol) > 0 && extern_symbol[0] == '&'
? extern_symbol + 1
: extern_symbol);
--- /dev/null
+{ Freestanding formal hole with &. }
+
+begin
+ ref int foo = nest C "&foo";
+ skip
+end