This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [google] Check if the nonnull attribute is applied to 'this' (issue4446070)
- From: Basile Starynkevitch <basile at starynkevitch dot net>
- To: dnovillo at google dot com (Diego Novillo)
- Cc: reply at codereview dot appspotmail dot com, lcwu at google dot com, jason at redhat dot com, gcc-patches at gcc dot gnu dot org
- Date: Fri, 29 Apr 2011 20:46:06 +0200
- Subject: Re: [google] Check if the nonnull attribute is applied to 'this' (issue4446070)
- References: <20110429150824.C78D4AE1DD@tobiano.tor.corp.google.com>
On Fri, 29 Apr 2011 11:08:24 -0400 (EDT)
dnovillo@google.com (Diego Novillo) wrote:
> This patch from Le-Chun Wu adds support to check whether a nonnull
> attribute is applied to 'this' pointer for non-static methods.
This bring me to a question. Does the C++ standard imply that this is
never a null pointer? (Last time I looked into a C++ standard, I was
not able to give a firm answer).
In other words, with
class Myclass {
int x;
public:
Myclass(int z=0): x(z) {};
int get(void) const { if (this) return x; else return 0; };
~Myclass() { };
};
can a C++ standard conforming compiler optimize the get () member
function to
inline int Myclass::get(void) { return x; };
(I tend to believe that such an optimization is incorrect, but I am not
sure). can a C++ program call
Myclass *t = null_ptr;
return t->get();
(I might believe this is not conforming to standards)
I feel that testing that this is not null is occasionnally useful. For
instance, if I coded a trivial interpreter (e.g. of a Lua or Python or
Lisp-like language) I would be tempted, if that language has a nil
value, to implement values as pointers to objects and to represent nil
as a C++ null_ptr. So I might even want to code something like
// my abstract top superclass for values
class Value {
virtual ~Value() {};
Value () {};
virtual void do_print(void) const = 0;
public:
void print(void) const { if (this) this->do_print(); };
};
class IntegerValue : public Value {
int x;
public:
IntegerValue (int z) : Value(), x(z) {}:
virtual void do_print (void) { cout << x; };
};
But I am not sure that such code is standard C++. However, GCC seems to
compile it as I expect! At least I still hope that future versions of
GCC would accept it (perhaps in some permissive mode, or with warnings)
Regards.
PS: By standard C++, I mean some recent or future C++ ISO standard (eg C++1x or C++0x).
--
Basile STARYNKEVITCH http://starynkevitch.net/Basile/
email: basile<at>starynkevitch<dot>net mobile: +33 6 8501 2359
8, rue de la Faiencerie, 92340 Bourg La Reine, France
*** opinions {are only mine, sont seulement les miennes} ***