Bug 104182

Summary: [12 Regression] Wrong code since r12-6329-g4f6bc28fc7dd86bd
Product: gcc Reporter: Martin Liška <marxin>
Component: c++Assignee: Jason Merrill <jason>
Severity: critical CC: eike, jason, webrown.cpp
Priority: P1 Keywords: wrong-code
Version: 12.0   
Target Milestone: 12.0   
See Also: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=103984
Host: Target:
Build: Known to work:
Known to fail: Last reconfirmed: 2022-01-22 00:00:00

Description Martin Liška 2022-01-22 09:25:22 UTC
Originally reported here:

for the following we emit a wrong code:

$ cat cmake-repro.C
#include <iostream>
#include <string>
#include <vector>

struct S
  int A;
  std::string B;

struct V
  std::vector<S> v;

static const V v{ { { { 1, "2" } } } };

int main()
  if (v.v[0].A != 1 || v.v[0].B[0] != '2')
  return 0;

$ g++ cmake-repro.C && ./a.out
Aborted (core dumped)
Comment 1 GCC Commits 2022-01-23 03:19:13 UTC
The master branch has been updated by Jason Merrill <jason@gcc.gnu.org>:


commit r12-6822-g9718bc4b03c1a94f7cf64860bbc828aa53c56234
Author: Jason Merrill <jason@redhat.com>
Date:   Sat Jan 22 17:11:54 2022 -0500

    c++: array temporary at file scope [PR104182]
    This is the same issue as PR104031, but that patch doesn't fix this
    testcase because in this case, current_function_decl isn't set when we get
    to cp_genericize_target_expr.  But there seems to be no need for
    is_local_temp to check for function scope; !TREE_STATIC should be enough.
            PR c++/104182
            * cp-gimplify.cc (cp_genericize_target_expr): Make sure nothing
            has set DECL_INITIAL on a TARGET_EXPR slot.
            * tree.cc (is_local_temp): Don't check DECL_CONTEXT.
            * g++.dg/cpp0x/initlist127.C: New test.
Comment 2 Jason Merrill 2022-01-23 22:34:05 UTC