https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92419

--- Comment #2 from Richard Biener <rguenth at gcc dot gnu.org> ---
bool 
varpool_node::ctor_useable_for_folding_p (void)
{
...
  /* Alias of readonly variable is also readonly, since the variable is stored
     in readonly memory.  We also accept readonly aliases of non-readonly
     locations assuming that user knows what he is asking for.  */
  if (!TREE_READONLY (decl) && !TREE_READONLY (real_node->decl))
    return false;

so looks like this is done on purpose?  Shouldn't we then diagnose
those aliases?  I'd have done

  if (!TREE_READONLY (real_node->decl))
    return false;

since as the comment says whether the variable may be stored in readonly
memory or not is what matters.  Was there a real reason to be this
forgiving for the testcase at hand?  Just to avoid the "asymmetry"
with the non-const alias of a const var?

Better testcase w/o unused 'tem':

int var = 3;
extern const int const_var __attribute__((alias("var")));

void bar()
{
  var = 5;
}
int foo()
{
  int tem = const_var;
  bar ();
  return const_var - tem;
}
int main()
{
  if (foo() != 2)
    __builtin_abort ();
  return 0;
}

Reply via email to