Revamp handling of function types, conversion to function ptr types.
Implicit conversion to function types is now a more standard part of the type conversion infrastructure, rather than special cases of things like FunctionSymbolExpr immediately returning a pointer type, etc. Improved AddressOfExpr::TypeCheck() to actually issue errors in cases where it's illegal to take the address of an expression. Added AddressOfExpr::GetConstant() implementation that handles taking the address of functions. Issue #223.
This commit is contained in:
@@ -15,7 +15,7 @@ export void f_f(uniform float RET[], uniform float aFOO[]) {
|
||||
float a = aFOO[programIndex];
|
||||
float b = aFOO[0]-1;
|
||||
uniform FuncType func = foo;
|
||||
RET[programIndex] = (func ? func : bar)(a, b);
|
||||
RET[programIndex] = (func ? func : &bar)(a, b);
|
||||
}
|
||||
|
||||
export void result(uniform float RET[]) {
|
||||
|
||||
@@ -14,7 +14,7 @@ static float bar(float a, float b) {
|
||||
export void f_f(uniform float RET[], uniform float aFOO[]) {
|
||||
float a = aFOO[programIndex];
|
||||
float b = aFOO[0]-1;
|
||||
FuncType func = foo;
|
||||
FuncType func = &foo;
|
||||
if (a == 2)
|
||||
func = NULL;
|
||||
if (func != NULL)
|
||||
|
||||
@@ -16,7 +16,7 @@ export void f_f(uniform float RET[], uniform float aFOO[]) {
|
||||
float b = aFOO[0]-1;
|
||||
FuncType func = NULL;
|
||||
if (a == 2)
|
||||
func = foo;
|
||||
func = &foo;
|
||||
if (!func)
|
||||
RET[programIndex] = -1;
|
||||
else
|
||||
|
||||
@@ -14,7 +14,7 @@ static float bar(float a, float b) {
|
||||
export void f_f(uniform float RET[], uniform float aFOO[]) {
|
||||
float a = aFOO[programIndex];
|
||||
float b = aFOO[0]-1;
|
||||
uniform FuncType func = bar;
|
||||
uniform FuncType func = &bar;
|
||||
if (aFOO[0] == 1)
|
||||
func = foo;
|
||||
RET[programIndex] = func(a, b);
|
||||
|
||||
Reference in New Issue
Block a user