[cfe-commits] [patch] Add codegen for the __noop intrinsic

Eli Friedman eli.friedman at gmail.com
Wed Sep 26 00:24:31 PDT 2012


On Tue, Sep 25, 2012 at 11:36 PM, Nico Weber <thakis at chromium.org> wrote:
> On Wed, Sep 26, 2012 at 3:06 PM, Nico Weber <thakis at chromium.org> wrote:
>> On Wed, Sep 26, 2012 at 2:49 PM, Eli Friedman <eli.friedman at gmail.com> wrote:
>>> On Tue, Sep 25, 2012 at 10:05 PM, Nico Weber <thakis at chromium.org> wrote:
>>>> Hi,
>>>>
>>>> similar to the __debugbreak patch, this adds codegen support for __noop.
>>>
>>> You don't actually have to call llvm.donothing... like the name says,
>>> it doesn't do anything. :)  "return RValue::get(0);" should be
>>> sufficient.
>>
>> My patch has nicer -S -emit-llvm output :-) But sure, I'll change it.
>>
>>>
>>> Do we actually perform semantic analysis correctly for __noop?
>>
>> Not completely.
>>
>>> In MSVC, are the arguments unevaluated in the semantic analysis sense?
>>
>> cl seems to do sema for __noop, __noop(3 + someclassinstanc) results
>> in a syntax error. So does wrapping a statement in __noop.

How about something like the following?

template<typename T> static void f() { T x = 10; }
void g() { __noop(f<void>()); }

(By "unevaluated', I mean in the same sense that the operand of sizeof
is unevaluated.)

>>> Do we do the right thing for expressions with non-POD type?
>>> Expressions with cleanups?
>>
>> It looks like cl runs cleanups, __noop(MyClass()) runs destructors
>> with cl (but not with clang). Do you want me to fix this before
>> landing this patch?
>
> Err, this is actually not true.

Okay.

-Eli



More information about the cfe-commits mailing list