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