Why did you mark PR96008 as a duplicate?  The ICE is a duplicate, but
the wrong IL is a C++ FE bug.

Thanks, David

On Tue, Jun 30, 2020 at 1:45 PM Martin Sebor <mse...@gmail.com> wrote:
>
> On 6/30/20 10:47 AM, David Edelsohn wrote:
> > Also, cpp1y/lambda-generic-69078-1.C elicits a similar, new warning:
> >
> > FAIL: g++.dg/cpp1y/lambda-generic-69078-1.C  -std=gnu++14 (test for
> > excess errors)
> > Excess errors:
> > g++.dg/cpp1y/lambda-generic-69078-1.C:23:13: warning: 'this' pointer
> > null [-Wnonnull]
>
> I think this (mainly the ICE) is the subject of pr95984.  AFAICT,
> the warning is working correctly but the IL the C++ front end
> emits doesn't look right: AFAICS, it creates a function object
> for the lambda and calls its operator() with a null this pointer:
>
> ; Function static decltype (((const main()::<lambda(auto:1
> ...)>*)0)->operator()<auto:1
> ...>(static_cast<auto:1&&>(main::._anon_0::_FUN::<unnamed>) ...))
> main()::<lambda(auto:1 ...)>::_FUN(auto:1 ...) [with auto:1 = {int};
> decltype (((const main()::<lambda(auto:1 ...)>*)0)->operator()<auto:1
> ...>(static_cast<auto:1&&>(main::._anon_0::_FUN::<unnamed>) ...)) =
> void] (null)
> ;; enabled by -tree-original
>
>
> <<cleanup_point <<< Unknown tree: expr_stmt
>    main()::<lambda(auto:1 ...)>::operator()<int> (0B, D.2440) >>>>>;
> return;
>
> Martin
>
> >
> > Thanks, David
> >
> > On Tue, Jun 30, 2020 at 12:23 PM David Malcolm <dmalc...@redhat.com> wrote:
> >>
> >> On Tue, 2020-06-30 at 10:12 -0600, Martin Sebor wrote:
> >>> On 6/30/20 8:47 AM, David Edelsohn via Gcc-patches wrote:
> >>>> The unexpected warning is
> >>>>
> >>>> gcc/testsuite/g++.dg/analyzer/pr94028.C:28:21: warning: use of
> >>>> possibly-NULL '<unknown>' where non-null expected [CWE-690]
> >>>> [-Wanalyzer-possible-null-argument]
> >>>>
> >>>> This is the same location as one of the existing "leak" warnings.
> >>>
> >>> I'm surprised that the Wnonull change triggers
> >>> a -Wanalyzer-possible-null-argument warning.  There is no
> >>> -Wnonnull for the test case with or without -fanalyzer (and
> >>> with or without optimization) so that suggests the two are
> >>> independent of one another.
> >>>
> >>> I'm also not sure I see a justification for a nonnull warning
> >>> in the test.  The note printed after the warning says:
> >>>
> >>>       |      |                     (5) possible return of NULL to ‘f’
> >>> from ‘j::operator new’
> >>>       |      |                     (6) argument 1 (‘<unknown>’) from
> >>> (4)
> >>> could be NULL where non-null expected
> >>>       |
> >>> /src/gcc/master/gcc/testsuite/g++.dg/analyzer/pr94028.C:19:3: note:
> >>> argument 1 of ‘j::j(B*, int)’ must be non-null
> >>>      19 |   j (B *, int)
> >>>         |   ^
> >>>
> >>> but the first argument in j::j(B*, int) is not marked nonnull,
> >>> and it's not the this pointer (treating those as implicitly
> >>> nonnull was one of the changes introduced by my patch).
> >>
> >> Are you sure it's not the "this" pointer?  Bear in mind that the C++
> >> "support" in the analyzer is practically non-existent; I haven't yet
> >> implemented any special-casing about how arguments are numbered, so it
> >> could well be the "this" pointer.
> >>
> >> If it is a complaint about the "this" pointer, that could explain why
> >> this started happening when your patch went in.
> >>
> >> Dave
> >>
> >>>
> >>> FWIW, I don't remember if I saw it when going through the test
> >>> results for my patch but if I did, it's possible that I assumed
> >>> it was unrelated because of the -Wanalyzer- option.  Sorry if
> >>> this was the wrong call.
> >>>
> >>> Martin
> >>
> >>>> How would you like pr94028.C to be adjusted in the testsuite to
> >>>> account for this?
> >>>>
> >>>> Thanks, David
> >>>>
> >>>> On Tue, Jun 30, 2020 at 10:18 AM David Malcolm <dmalc...@redhat.com
> >>>>> wrote:
> >>>>> On Tue, 2020-06-30 at 09:51 -0400, David Edelsohn wrote:
> >>>>>> The changes to the non-null warning now produce an additional
> >>>>>> warning
> >>>>>> for analyzer/pr94028.C on one of the "leak" lines.  This causes
> >>>>>> new
> >>>>>> failures on trunk.
> >>>>>
> >>>>> Hi David
> >>>>>
> >>>>> Do you have the output to hand?  What is the full text of the new
> >>>>> diagnostic?
> >>>>>
> >>>>> Some high level questions:
> >>>>>     * Ought GCC to warn for that code?  (or not)
> >>>>>     * Is it behavior we ought to have a test for?
> >>>>>
> >>>>> Note that AFAIK there are *two* kinds of non-null warnings that
> >>>>> GCC can
> >>>>> emit: the kind emitted by Martin's code, versus those emitted by
> >>>>> -fanalyzer (the latter imply the much more expensive analysis
> >>>>> performed
> >>>>> by -fanalyzer, and are controlled by the various -Wanalyzer-
> >>>>> *null*
> >>>>> options; see
> >>>>> https://gcc.gnu.org/onlinedocs/gcc-10.1.0/gcc/Static-Analyzer-Options.html
> >>>>> )
> >>>>>
> >>>>>
> >>>>>> Because non-null is not the purpose of the analyzer test, I
> >>>>>> propose
> >>>>>> pruning the output to resolve the new failures.
> >>>>>
> >>>>> Looking back through bugzilla, it seems that the main purpose of
> >>>>> adding
> >>>>> that test was to ensure that -fanalyzer doesn't ICE on that code.
> >>>>>
> >>>>> At some point I hope to properly support C++ in -fanalyzer, at
> >>>>> which
> >>>>> point some kind of null warning may be warranted on that
> >>>>> code.  Sadly
> >>>>> I'm not yet at that point.  FWIW I'm currently working on a big
> >>>>> rewrite
> >>>>> of how state is tracked within the analyzer, as I've identified
> >>>>> at
> >>>>> least two major flaws in the current implementation, which my
> >>>>> rewrite
> >>>>> addresses.  I'm deferring on C++ support until that rewrite is
> >>>>> done.
> >>>>>
> >>>>>>     Alternatively, I
> >>>>>> could explicitly test for the additional non-null warning.
> >>>>>>
> >>>>>> Do you have any preferences?
> >>>>>
> >>>>> This test is controlled by analyzer.exp and thus, for example, is
> >>>>> disabled if the analyzer was disabled at configure time.
> >>>>>
> >>>>> If this is coming from Martin's non-analyzer code, a third
> >>>>> possibility
> >>>>> would be to use -Wno-something to disable that warning, so that
> >>>>> the
> >>>>> analyzer test can focus on the -fanalyzer test, as it were (and
> >>>>> if this
> >>>>> is a behavior that ought to be checked for in Martin's warning,
> >>>>> then
> >>>>> copy the pertinent fragment of the testcase to one of the g++.dg
> >>>>> cases,
> >>>>> I suppose).  I think I prefer that approach.
> >>>>>
> >>>>> How does this sound?
> >>>>>
> >>>>>> I propose appending
> >>>>>>
> >>>>>> // { dg-prune-output "where non-null expected" }
> >>>>>>
> >>>>>> to the file to prune the warning output.
> >>>>>>
> >>>>>> Thanks, David
> >>>>>
> >>>>> Thanks for looking into this; hope this is constructive.
> >>>>> Dave
> >>>>>
> >>
>

Reply via email to