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:
Matt Pharr
2012-04-03 10:09:07 -07:00
parent b813452d33
commit 4cd0cf1650
8 changed files with 149 additions and 41 deletions

View File

@@ -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[]) {

View File

@@ -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)

View File

@@ -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

View File

@@ -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);