[cfe-dev] GCC's "Temporaries May Vanish Before You Expect"
Jordan Rose
jordan_rose at apple.com
Wed Sep 12 16:32:52 PDT 2012
On Sep 12, 2012, at 16:27 , David Blaikie <dblaikie at gmail.com> wrote:
> On Wed, Sep 12, 2012 at 4:10 PM, Jordan Rose <jordan_rose at apple.com> wrote:
>> The thing that keeps me from removing it is that it IS more convenient and it CAN be made safe. The first way is to use C++11 to forbid the use of this function on rvalues; that looks like this:
>>
>> template<class T> const T *getAs() const && = delete;
>> template<class T> const T *getAs() const & {
>> return dyn_cast<T>(this);
>> }
>
> Indeed, my thoughts precisely. [I wonder at what point it'll be worth
> moving default development to C++11 and just keeping some bots around
> for C++98 back compat testing.]
>
>> This could be hidden behind a compatibility macro:
>>
>> template<class T> const T *getAs() const LLVM_RVALUE_DELETE;
>> template<class T> const T *getAs() const LLVM_LVALUE {
>> return dyn_cast<T>(this);
>> }
>
> What do you envision those macros being defined to in C++98? Wouldn't
> you end up with errors relating to redeclaration of class members if
> they expanded to nothing in C++98 builds.
I guess I should have tried it first. I forgot you can't redeclare class members. :-(
> Seems to me, unfortunately, like we'd have to #ifdef the extra
> declaration entirely, or put the declaration inside a function-like
> macro if possible, etc)
Yes, that leaves something ugly like this:
LLVM_LVALUE_ONLY(template<class T> const T *getAs() const) {
}
…and I don't even know how that would handle multiple template arguments. Bleah.
>> The second way is if -fcatch-undefined-behavior could be augmented to handle this case. I have no idea how to do this, though -- perhaps it requires something ASan-ish to poison the temporary memory once its lifetime ends.
>>
>> Any chance of either of these happening on trunk?
>
> +Richard Smith for the undefined behavior checking possibilities.
More information about the cfe-dev
mailing list