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

            Bug ID: 69901
           Summary: Iniitializing non-const global array variable from
                    runtime const global variable does not copy all values
                    properly
           Product: gcc
           Version: unknown
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: piotrwn1 at gmail dot com
  Target Milestone: ---

We discovered this in our project working under gcc4.9.2 (-std=c++14) but it is
also present in gcc5.2 - whilst not present in clang.

The code below does not copy b1 to b2 properly:
  - b2[0].c.a is 0
  - b1.c.a

Making b1 compiler time constant (by making makeA() function constexpr) "fixes"
the problem:

#include <iostream>

struct A 
{
    int a;
};

struct B
{
    int b;
    A c;
};

/*constexpr*/ //<-- contstexpr here "fixes" the problem
A makeA()   
{
    A a = {2};
    return a;
}

const B b1 = {1, makeA()};

B b2[] = { b1 };


int main()
{
    std::cout << b2[0].c.a << std::endl; // 0 (should be 2)
    std::cout << b1.c.a << std::endl;    // 2
}

The link to coliru: http://coliru.stacked-crooked.com/a/4f1ef718fea4e76f

The original example was with std::vector and much more complicated structs. We
did an effort to simplify example. Simplifying more also "fixes" the problem.

BR,
Piotr Nycz (piotrwn1(at)gmail.com)

Reply via email to