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

            Bug ID: 88572
           Summary: error: braces around scalar initializer - should be a
                    warning
           Product: gcc
           Version: 9.0
            Status: UNCONFIRMED
          Keywords: rejects-valid
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: wjwray at gmail dot com
                CC: bangerth at apex68 dot ticam.utexas.edu,
                    gcc-bugs at gcc dot gnu.org, loewis at gcc dot gnu.org,
                    martin at loewis dot home.cs.tu-berlin.de, neil at gcc dot 
gnu.org,
                    unassigned at gcc dot gnu.org
  Target Milestone: ---

Note: This is a C++ specific issue (not C). All versions since C++11.

    int a[1]{{0}}; // GCC error - should be warning

GCC:   error: braces around scalar initializer for type 'int'
Clang: warning: braces around scalar initializer [-Wbraced-scalar-init]
Intel: warning #1119: extra braces are nonstandard
MSVC:  no warning (with \Wall)

    "I'm frankly stunned that GCC rejects."
        Quote from a Clang dev (cfe-dev thread linked below).

Same error on initializing a scalar member of an aggregate:

    struct S { int i; };
    S s{{0}}; // GCC error - should be warning

Or, on initializing an array-of-scalar aggregate member:

    struct SA { int n[1]; };
    SA sa{{{0}}}; // GCC error - should be warning

A different but related bug (non-SFINAE-error) was just fixed on Clang trunk.
The discussion thread is here:
http://clang-developers.42468.n3.nabble.com/braces-around-scalar-initializer-warning-should-be-error-td4063311.html
The Clang fix commit is here, with test code applicable to this GCC bug:
https://github.com/llvm-mirror/clang/commit/3410781dffff51e89751a2494bd8dfe7e7d83541

Here's a compiler explorer link with the test code:
https://gcc.godbolt.org/z/8HCba4

test code listing
=================

  using valid = int&;
  using invalid = float&;

  template<typename T> valid braces1(decltype(T{0})*);
  template<typename T> invalid braces1(...);

  template<typename T> valid braces2(decltype(T{{0}})*);
  template<typename T> invalid braces2(...);

  template<typename T> valid braces3(decltype(T{{{0}}})*);
  template<typename T> invalid braces3(...);

  valid   scalar_1_brace = braces1<int>(0);
  invalid scalar_2_brace = braces2<int>(0);
  invalid scalar_3_brace = braces3<int>(0);

//int a[1]{{0}}; // GCC error - should be warning

  valid   array_scalar_1_brace = braces1<int[1]>(0);
  valid   array_scalar_2_brace = braces2<int[1]>(0); // GCC error
  invalid array_scalar_3_brace = braces3<int[1]>(0);

  struct SS { int n; };
//SS ss{{0}}; // GCC error - should be warning

  valid   struct_scalar_1_brace = braces1<SS>(0);
  valid   struct_scalar_2_brace = braces2<SS>(0);  // GCC error
  invalid struct_scalar_3_brace = braces3<SS>(0);

  struct SAS { int n[1]; };
//SAS sas{{{0}}}; // GCC error - should be warning

  valid struct_array_scalar_1_brace = braces1<SAS>(0);
  valid struct_array_scalar_2_brace = braces2<SAS>(0);
  valid struct_array_scalar_3_brace = braces3<SAS>(0); // GCC error

Reply via email to