This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

C6000-CGT: Aggregate initialization bug

Part Number: C6000-CGT

Hello,

The struct below is not initialized when using brace-initialization. This seems to be the same issue as reported here https://community.intel.com/t5/Intel-C-Compiler/Aggregate-initialization-bug-with-nested-struct/m-p/1271801. The members a through d should be initialized as int{} to 0. I assume it's related to the non-default constructor of Q, the values are uninitialized also with an std::vector member as in the linked post. The struct seems to be correctly zero initialized if there are no user-provided constructors.


Compiler version

cl6x --help
TMS320C6x C/C++ Compiler v8.3.10
Tools Copyright (c) 1996-2018 Texas Instruments Incorporated



Compilation flags. Observed at O1/2/3
-qq -mv6600 --relaxed_ansi --define=SOC_TDA3XX --keep_unneeded_statics --diag_wrap=off --display_error_number --diag_suppress=556 --diag_suppress=2458 --mem_model:data=far --wchar_t=16 --fp_reassoc=off --float_operations_allowed=all --ramfunc=off --emit_warnings_as_errors -O3 --opt_for_speed=4 -DNDEBUG --symdebug:none --c++14



Code
#include <xdc/runtime/System.h>
#include <array>

class Q
{
public:
  Q() : member{5} {}
  int member;
};

struct A
{
    int a;
    int b;
    int c;
    int d;
};

struct B
{
    A a;
    Q q;
};

void modifyStack()
{
  std::array<int, 16> values{};
  for (int i = 0; i < values.size(); ++i)
  {
    values[i] = i;
  }
}

void initializeAndPrint()
{
  // Aggregate initialization with {}. dcl.init.aggr/7
  // The members a,b,c,d are not initialized.
  // The class member is initialized through default constructor.
  B b{};

  System_printf("b.a.a: %d\n", b.a.a);
  System_printf("b.a.b: %d\n", b.a.b);
  System_printf("b.a.c: %d\n", b.a.c);
  System_printf("b.a.d: %d\n", b.a.d);
  System_printf("b.q.member: %d\n", b.q.member);
}

void init()
{
  modifyStack();
  initializeAndPrint();
}


Output
b.a.a: 12
b.a.b: 13
b.a.c: 14
b.a.d: 15
b.q.member: 5