On Aug 30, 2011, at 7:37 PM, David Blaikie wrote:
> On Mon, Aug 29, 2011 at 5:46 PM, Douglas Gregor <[email protected]> wrote:
>
> On Aug 21, 2011, at 9:18 PM, David Blaikie wrote:
>
> > As a small indirect first attempt I've included a patch that:
> >
> > 1) changes "NULL" to "null" in "initialization of pointer of type %0
> > to NULL from a constant boolean expression" - since NULL is a specific
> > macro but the general concept is simply a "null pointer".
>
> Looks good.
>
> Hmm - I see you checked in the fixit fix, but not this text change. Was there
> a reason? Good thing in any case, since I'd failed to update the tests. The
> attached patch includes the updated tests.
I... think there was some redundancy in messages that confused me. The change
to the message text is good.
> [though these test cases surprise me a bit - I hadn't realized that any
> integral zero constant (not just literals) were valid null pointer literals.
> Sounds like another case for a warning. Seems unlikely anyone's legitimately
> writing "const int null = 0; int* i = null;" are they? Well, I'll see about
> handling that in the overall/whitelisting way. Accept zero integer literals,
> NULL, and nullptr as null pointers & warn on anything else]
>
>
> > 2) adds a fixup for this warning in C++0x to suggest using nullptr
> >
> > I think there's still a bunch of things worth discussing about when to
> > suggest nullptr and what to suggest in C++98 (0, NULL, nothing at
> > all?) & I'd like to apply this kind of suggestion/fixup in a much more
> > general way (to all null pointer literals that aren't nullptr, not
> > just the false boolean literal) - but I thought this might be a
> > moderately easy experiment, even if it's throwaway, and might be a
> > more concrete thing to start such discussions.
>
>
> Seems like we should suggest nullptr, NULL, or 0, depending on which dialect
> we're in, as we've done elsewhere.
>
> Agreed - I hadn't seen the smarts to do this when I sent this patch out, & I
> stumbled across it in the uninitialized variable case afterwards.
>
> I've put a public utility function in Sema to produce a StringRef of the
> appropriate null pointer literal & used that in both cases.
> Looking at other similar cases I came across a case in ~line 250,
> SemaExpr.cpp - handling missing null sentinel nodes (in ObjC/C++ I assume). I
> don't fully understand the last case there, though - that chooses between "0"
> and "0L". Also, this seems inconsistent with the (matching) null case in
> SemaCodeComplete.cpp which suggests "nil", "NULL", or "(void*)0".
Ick. The reason for 0L is that, when we're dealing with C-style varargs, we
need to make sure that the 0 value we suggest is the same length as a pointer.
It would be good to give getNullPointerLiteral() the ability to produce 0L when
needed, perhaps with a configuration option.
> What would be the right set of suggestions for null pointer literals across
> all clang languages (C needs the cast (or NULL), objc prefers nil over NULL -
> should it prefer nil over nullptr in C++0x? (nil > nullptr > NULL > 0))?
nil > nullptr > NULL > 0 is reasonable.
- Doug
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits