Thread overview
Forward reference not working in nested functions
Dec 12, 2012
H. S. Teoh
Dec 12, 2012
Jacob Carlborg
Dec 12, 2012
Timon Gehr
Dec 12, 2012
Timon Gehr
Dec 12, 2012
bearophile
December 12, 2012
Is this a known bug or deliberate limitation?

	void func(T)(T data) {
		void subfunc1() {
			process(data);
			if (recurse) subfunc2(); // Error: subfunc2 undefined
		}

		void subfunc2() {
			process(data);
			if (recurse) subfunc1(); // Error: subfunc1 undefined
		}

		subfunc1();
	}


T

-- 
Heads I win, tails you lose.
December 12, 2012
On 2012-12-12 19:03, H. S. Teoh wrote:
> Is this a known bug or deliberate limitation?
>
> 	void func(T)(T data) {
> 		void subfunc1() {
> 			process(data);
> 			if (recurse) subfunc2(); // Error: subfunc2 undefined
> 		}
>
> 		void subfunc2() {
> 			process(data);
> 			if (recurse) subfunc1(); // Error: subfunc1 undefined
> 		}
>
> 		subfunc1();
> 	}

It's basically the same thing as you need to declare variables in correct order in a function.

-- 
/Jacob Carlborg
December 12, 2012
On 12/12/2012 07:03 PM, H. S. Teoh wrote:
> Is this a known bug or deliberate limitation?
>
> 	void func(T)(T data) {
> 		void subfunc1() {
> 			process(data);
> 			if (recurse) subfunc2(); // Error: subfunc2 undefined
> 		}
>
> 		void subfunc2() {
> 			process(data);
> 			if (recurse) subfunc1(); // Error: subfunc1 undefined
> 		}
>
> 		subfunc1();
> 	}
>
>
> T
>

Both.
December 12, 2012
On 12/12/2012 09:03 PM, Timon Gehr wrote:
> On 12/12/2012 07:03 PM, H. S. Teoh wrote:
>> Is this a known bug or deliberate limitation?
>>
>>     void func(T)(T data) {
>>         void subfunc1() {
>>             process(data);
>>             if (recurse) subfunc2(); // Error: subfunc2 undefined
>>         }
>>
>>         void subfunc2() {
>>             process(data);
>>             if (recurse) subfunc1(); // Error: subfunc1 undefined
>>         }
>>
>>         subfunc1();
>>     }
>>
>>
>> T
>>
>
> Both.

(A silly workaround is the following, but I do not know if this has been documented since it has been discovered:


    void func(T)(T data) {
        void subfunc1()() {
            process(data);
            if (recurse) subfunc2(); // Ok.
        }

        void subfunc2() {
            process(data);
            if (recurse) subfunc1(); // Ok.
        }

        subfunc1();
    }
)
December 12, 2012
Timon Gehr:

> (A silly workaround is the following, but I do not know if this has been documented since it has been discovered:

The workaround I use was found by Don, is to the define an inner static struct with static methods.

Bye,
bearophile