| Thread overview | |||||||||
|---|---|---|---|---|---|---|---|---|---|
|
April 09, 2009 Compiler does some flow analysis with -O..? | ||||
|---|---|---|---|---|
| ||||
Try this.
void main()
{
int x = void;
int y = 3;
if(y < 10)
x += 5;
else
x = 2;
}
Notice that x is uninitialized, so "x += 5;" shouldn't work.
If you compile this, even with -w, DMD happily accepts it. But if you throw -O, it gives the error:
dtest.d(187): Error: variable x used before set
This seems to be a relatively recent development, and doesn't seem to be documented. It's also very surprising that it only happens when -O is thrown.
I like it a lot. Could this functionality be formalized and extended (i.e. to include accesses to variables declared like "int x;", like it says in the spec)?
| ||||
April 09, 2009 Re: Compiler does some flow analysis with -O..? | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Jarrett Billingsley | On Thu, 09 Apr 2009 18:19:02 +0400, Jarrett Billingsley <jarrett.billingsley@gmail.com> wrote: > Try this. > > void main() > { > int x = void; > int y = 3; > > if(y < 10) > x += 5; > else > x = 2; > } > > Notice that x is uninitialized, so "x += 5;" shouldn't work. > > If you compile this, even with -w, DMD happily accepts it. But if you > throw -O, it gives the error: > > dtest.d(187): Error: variable x used before set > > This seems to be a relatively recent development, and doesn't seem to > be documented. It's also very surprising that it only happens when -O > is thrown. > > I like it a lot. Could this functionality be formalized and extended > (i.e. to include accesses to variables declared like "int x;", like it > says in the spec)? I believe this is just an optimization and not a general-purpose flow analysis: Step 0: int x = void; int y = 3; if (y < 10) x += 5; else x = 2; Step 1: int x = void; int y = 3; if (true) x += 5; else x = 2; Step2: int x = void; int y = 3; x += 5; // Error: variable x used before set | |||
April 09, 2009 Re: Compiler does some flow analysis with -O..? | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Denis Koroskin | On Thu, Apr 9, 2009 at 10:28 AM, Denis Koroskin <2korden@gmail.com> wrote:
> I believe this is just an optimization and not a general-purpose flow analysis:
It happens even with a non-trivial condition.
| |||
April 09, 2009 Re: Compiler does some flow analysis with -O..? | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Jarrett Billingsley | On Thu, 09 Apr 2009 18:53:07 +0400, Jarrett Billingsley <jarrett.billingsley@gmail.com> wrote: > On Thu, Apr 9, 2009 at 10:28 AM, Denis Koroskin <2korden@gmail.com> wrote: > >> I believe this is just an optimization and not a general-purpose flow >> analysis: > > It happens even with a non-trivial condition. Now I am convinced: extern(C) int rand(); void main() { int x = void; if (rand() == 0) { x += 5; // line 7 } } test.d(7): Error: variable x used before set It only happens with DMD1.042+ Yay! | |||
April 09, 2009 Re: Compiler does some flow analysis with -O..? | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Denis Koroskin | "Denis Koroskin" <2korden@gmail.com> wrote in message news:op.ur4kb8ffo7cclz@soldat.creatstudio.intranet... > Now I am convinced: > > extern(C) int rand(); > > void main() > { > int x = void; > if (rand() == 0) { > x += 5; // line 7 > } > } > > test.d(7): Error: variable x used before set > > It only happens with DMD1.042+ > > Yay! I guess I'm going to have to start using -O in my debug builds...unless this behavior becomes independant of the -O switch...wink wink nudge nudge... | |||
April 09, 2009 Re: Compiler does some flow analysis with -O..? | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Nick Sabalausky | On Thu, 09 Apr 2009 20:36:43 +0400, Nick Sabalausky <a@a.a> wrote:
> "Denis Koroskin" <2korden@gmail.com> wrote in message
> news:op.ur4kb8ffo7cclz@soldat.creatstudio.intranet...
>> Now I am convinced:
>>
>> extern(C) int rand();
>>
>> void main()
>> {
>> int x = void;
>> if (rand() == 0) {
>> x += 5; // line 7
>> }
>> }
>>
>> test.d(7): Error: variable x used before set
>>
>> It only happens with DMD1.042+
>>
>> Yay!
>
> I guess I'm going to have to start using -O in my debug builds...unless this
> behavior becomes independant of the -O switch...wink wink nudge nudge...
>
>
Yeah, me too!
BTW, that's a breaking change! XD
| |||
April 10, 2009 Re: Compiler does some flow analysis with -O..? | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Denis Koroskin | Denis Koroskin wrote:
> BTW, that's a breaking change! XD
Ssh!
| |||
Copyright © 1999-2021 by the D Language Foundation
Permalink
Reply