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

--- Comment #3 from Jonathan Wakely <redi at gcc dot gnu.org> ---
The relevant code is:

      /* It is invalid to initialize a non-aggregate type with a
         brace-enclosed initializer before C++0x.
         We need to check for BRACE_ENCLOSED_INITIALIZER_P here because
         of g++.old-deja/g++.mike/p7626.C: a pointer-to-member constant is
         a CONSTRUCTOR (with a record type).  */
      if (TREE_CODE (stripped_init) == CONSTRUCTOR
          /* Don't complain about a capture-init.  */
          && !CONSTRUCTOR_IS_DIRECT_INIT (stripped_init)
          && BRACE_ENCLOSED_INITIALIZER_P (stripped_init))  /* p7626.C */
        {
          if (SCALAR_TYPE_P (type))
            {
              if (cxx_dialect < cxx11
                  /* Isn't value-initialization.  */
                  || CONSTRUCTOR_NELTS (stripped_init) > 0)
                {
                  if (complain & tf_error)
                    error ("braces around scalar initializer for type %qT",
                           type);
                  init = error_mark_node;
                }
            }

The condition means we give an error for any braced-init-list in C++98, and for
a non-empty braced-init-list in later dialects . But the latter condition is
wrong, it should allow a single element (and presumably more than one element
will be rejected as an invalid initializer anyway).

I'm not even sure we should warn about this.

Reply via email to