Issue error on "void" typed variable, function parameter, or struct member.

This commit is contained in:
Matt Pharr
2012-02-06 07:44:45 -08:00
parent fa7a7fe23e
commit 977b983771
10 changed files with 56 additions and 1 deletions

View File

@@ -332,6 +332,11 @@ Declarator::GetType(const Type *base, DeclSpecs *ds) const {
break;
case DK_ARRAY:
if (type == AtomicType::Void) {
Error(pos, "Arrays of \"void\" type are illegal.");
return NULL;
}
type = new ArrayType(type, arraySize);
if (child)
return child->GetType(type, ds);
@@ -358,6 +363,11 @@ Declarator::GetType(const Type *base, DeclSpecs *ds) const {
"function parameter declaration for parameter \"%s\".",
lGetStorageClassName(d->declSpecs->storageClass),
sym->name.c_str());
if (sym->type == AtomicType::Void) {
Error(sym->pos, "Parameter with type \"void\" illegal in function "
"parameter list.");
sym->type = NULL;
}
const ArrayType *at = dynamic_cast<const ArrayType *>(sym->type);
if (at != NULL) {
@@ -544,7 +554,9 @@ Declaration::GetVariableDeclarations() const {
Symbol *sym = decl->GetSymbol();
sym->type = sym->type->ResolveUnboundVariability(Type::Varying);
if (dynamic_cast<const FunctionType *>(sym->type) == NULL) {
if (sym->type == AtomicType::Void)
Error(sym->pos, "\"void\" type variable illegal in declaration.");
else if (dynamic_cast<const FunctionType *>(sym->type) == NULL) {
m->symbolTable->AddVariable(sym);
vars.push_back(VariableDeclaration(sym, decl->initExpr));
}
@@ -611,6 +623,9 @@ GetStructTypesNamesPositions(const std::vector<StructDeclaration *> &sd,
Symbol *sym = d->GetSymbol();
if (sym->type == AtomicType::Void)
Error(d->pos, "\"void\" type illegal for struct member.");
const ArrayType *arrayType =
dynamic_cast<const ArrayType *>(sym->type);
if (arrayType != NULL && arrayType->GetElementCount() == 0) {

View File

@@ -237,6 +237,11 @@ Module::AddGlobalVariable(Symbol *sym, Expr *initExpr, bool isConst) {
return;
}
if (sym->type == AtomicType::Void) {
Error(sym->pos, "\"void\" type global variable is illegal.");
return;
}
sym->type = ArrayType::SizeUnsizedArrays(sym->type, initExpr);
if (sym->type == NULL)
return;

5
tests_errors/void-1.ispc Normal file
View File

@@ -0,0 +1,5 @@
// "void" type variable illegal in declaration
int func() {
void x;
}

5
tests_errors/void-2.ispc Normal file
View File

@@ -0,0 +1,5 @@
// Parameter with type "void" illegal in function parameter list
void func(void x, void y) {
return x+y;
}

5
tests_errors/void-3.ispc Normal file
View File

@@ -0,0 +1,5 @@
// "void" type illegal for struct member
struct Foo {
void x;
};

3
tests_errors/void-4.ispc Normal file
View File

@@ -0,0 +1,3 @@
// "void" type global variable is illegal
void x;

View File

@@ -0,0 +1,5 @@
// Arrays of "void" type are illegal
float f_fu(uniform void aFOO[]) {
return 0;
}

View File

@@ -0,0 +1,4 @@
// Arrays of "void" type are illegal
uniform void aFOO[] = { NULL };

View File

@@ -0,0 +1,7 @@
// Arrays of "void" type are illegal
struct Foo {
void aFOO[];
};

View File

@@ -1165,6 +1165,7 @@ ArrayType::ArrayType(const Type *c, int a)
: child(c), numElements(a) {
// 0 -> unsized array.
Assert(numElements >= 0);
Assert(c != AtomicType::Void);
}