[Bug c++/104373] New: [12 regression] bogus -Wmaybe-uninitialized warning with array new

sss@li-snyder.org gcc-bugzilla@gcc.gnu.org
Thu Feb 3 20:34:45 GMT 2022


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

            Bug ID: 104373
           Summary: [12 regression] bogus -Wmaybe-uninitialized warning
                    with array new
           Product: gcc
           Version: 12.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: sss@li-snyder.org
  Target Milestone: ---

hi -

With a recent checkout of gcc12 (20220203), on a x86_64-pc-linux-gnu host,
the following source gives bogus -Wmaybe-uninitialized warnings
with -Wall:

--------------------------------------------------------------
void* operator new[](unsigned long, void* __p);

struct allocator
{
  ~allocator();
};


void *foo (void *p)
{
  return p ? new(p) allocator[1] : new allocator[1];
}
--------------------------------------------------------------

$ g++ -Wall -c gccbug.cc
gccbug.cc: In function ‘void* foo(void*)’:
gccbug.cc:11:51: warning: ‘<anonymous>’ may be used uninitialized
[-Wmaybe-uninitialized]
   11 |   return p ? new(p) allocator[1] : new allocator[1];
      |                                                   ^
gccbug.cc:11:51: note: ‘<anonymous>’ was declared here
   11 |   return p ? new(p) allocator[1] : new allocator[1];
      |                                                   ^
gccbug.cc:11:32: warning: ‘<anonymous>’ may be used uninitialized
[-Wmaybe-uninitialized]
   11 |   return p ? new(p) allocator[1] : new allocator[1];
      |                                ^
gccbug.cc:11:32: note: ‘<anonymous>’ was declared here
   11 |   return p ? new(p) allocator[1] : new allocator[1];
      |                                ^


>From git bisect, this appears to have been introduced by this commit:

commit beaee0a871b6485d20573fe050b1fd425581e56a (HEAD)
Author: Jason Merrill <jason@redhat.com>
Date:   Sat Jan 1 16:00:22 2022 -0500

    c++: temporary lifetime with array aggr init [PR94041]

    The previous patch fixed temporary lifetime for aggregate initialization of
    classes; this one extends that fix to arrays.  This specifically reverses
my
    r74790, the patch for PR12253, which was made wrong when these semantics
    were specified in DR201.

    Since the array cleanup region encloses the regions for any temporaries, we
    don't need to add an additional region for the array object itself in
either
    initialize_local_var or split_nonconstant_init; we do, however, need to
tell
    split_nonconstant_init how to disable the cleanup once an enclosing object
    is fully constructed, at which point we want to run that destructor
instead.


FWIW, the warning goes away if the conditional expression in foo()
is rewritten as an explicit if statement.


More information about the Gcc-bugs mailing list