On Thu, Oct 29, 2020 at 04:50:54PM +0100, Jan Hubicka wrote: > * tree.c (build_string): Update. > * tree-core.h (tree_fixed_cst): Avoid typeless storage.
Is it valid then to #define TREE_STRING_POINTER(NODE) \ ((const char *)(STRING_CST_CHECK (NODE)->string.str)) and strcpy etc. it around though? Maybe yes, because stores through char can alias anything. > diff --git a/gcc/tree-core.h b/gcc/tree-core.h > index c9280a8d3b1..63dbb5b8eab 100644 > --- a/gcc/tree-core.h > +++ b/gcc/tree-core.h > @@ -1401,7 +1401,8 @@ struct GTY(()) tree_fixed_cst { > struct GTY(()) tree_string { > struct tree_typed typed; > int length; > - char str[1]; > + /* Avoid char array that would make whole type to be typeless storage. */ > + struct {char c;} str[1]; > }; > > struct GTY(()) tree_complex { > diff --git a/gcc/tree.c b/gcc/tree.c > index 81f867ddded..84115630184 100644 > --- a/gcc/tree.c > +++ b/gcc/tree.c > @@ -2273,7 +2273,7 @@ build_string (unsigned len, const char *str /*= NULL */) > memcpy (s->string.str, str, len); > else > memset (s->string.str, 0, len); > - s->string.str[len] = '\0'; > + s->string.str[len].c = '\0'; > > return s; > } Jakub