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