Issue error on "void" typed variable, function parameter, or struct member.
This commit is contained in:
17
decl.cpp
17
decl.cpp
@@ -332,6 +332,11 @@ Declarator::GetType(const Type *base, DeclSpecs *ds) const {
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case DK_ARRAY:
|
case DK_ARRAY:
|
||||||
|
if (type == AtomicType::Void) {
|
||||||
|
Error(pos, "Arrays of \"void\" type are illegal.");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
type = new ArrayType(type, arraySize);
|
type = new ArrayType(type, arraySize);
|
||||||
if (child)
|
if (child)
|
||||||
return child->GetType(type, ds);
|
return child->GetType(type, ds);
|
||||||
@@ -358,6 +363,11 @@ Declarator::GetType(const Type *base, DeclSpecs *ds) const {
|
|||||||
"function parameter declaration for parameter \"%s\".",
|
"function parameter declaration for parameter \"%s\".",
|
||||||
lGetStorageClassName(d->declSpecs->storageClass),
|
lGetStorageClassName(d->declSpecs->storageClass),
|
||||||
sym->name.c_str());
|
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);
|
const ArrayType *at = dynamic_cast<const ArrayType *>(sym->type);
|
||||||
if (at != NULL) {
|
if (at != NULL) {
|
||||||
@@ -544,7 +554,9 @@ Declaration::GetVariableDeclarations() const {
|
|||||||
Symbol *sym = decl->GetSymbol();
|
Symbol *sym = decl->GetSymbol();
|
||||||
sym->type = sym->type->ResolveUnboundVariability(Type::Varying);
|
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);
|
m->symbolTable->AddVariable(sym);
|
||||||
vars.push_back(VariableDeclaration(sym, decl->initExpr));
|
vars.push_back(VariableDeclaration(sym, decl->initExpr));
|
||||||
}
|
}
|
||||||
@@ -611,6 +623,9 @@ GetStructTypesNamesPositions(const std::vector<StructDeclaration *> &sd,
|
|||||||
|
|
||||||
Symbol *sym = d->GetSymbol();
|
Symbol *sym = d->GetSymbol();
|
||||||
|
|
||||||
|
if (sym->type == AtomicType::Void)
|
||||||
|
Error(d->pos, "\"void\" type illegal for struct member.");
|
||||||
|
|
||||||
const ArrayType *arrayType =
|
const ArrayType *arrayType =
|
||||||
dynamic_cast<const ArrayType *>(sym->type);
|
dynamic_cast<const ArrayType *>(sym->type);
|
||||||
if (arrayType != NULL && arrayType->GetElementCount() == 0) {
|
if (arrayType != NULL && arrayType->GetElementCount() == 0) {
|
||||||
|
|||||||
@@ -237,6 +237,11 @@ Module::AddGlobalVariable(Symbol *sym, Expr *initExpr, bool isConst) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (sym->type == AtomicType::Void) {
|
||||||
|
Error(sym->pos, "\"void\" type global variable is illegal.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
sym->type = ArrayType::SizeUnsizedArrays(sym->type, initExpr);
|
sym->type = ArrayType::SizeUnsizedArrays(sym->type, initExpr);
|
||||||
if (sym->type == NULL)
|
if (sym->type == NULL)
|
||||||
return;
|
return;
|
||||||
|
|||||||
5
tests_errors/void-1.ispc
Normal file
5
tests_errors/void-1.ispc
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
// "void" type variable illegal in declaration
|
||||||
|
|
||||||
|
int func() {
|
||||||
|
void x;
|
||||||
|
}
|
||||||
5
tests_errors/void-2.ispc
Normal file
5
tests_errors/void-2.ispc
Normal 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
5
tests_errors/void-3.ispc
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
// "void" type illegal for struct member
|
||||||
|
|
||||||
|
struct Foo {
|
||||||
|
void x;
|
||||||
|
};
|
||||||
3
tests_errors/void-4.ispc
Normal file
3
tests_errors/void-4.ispc
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
// "void" type global variable is illegal
|
||||||
|
|
||||||
|
void x;
|
||||||
5
tests_errors/void-array-1.ispc
Normal file
5
tests_errors/void-array-1.ispc
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
// Arrays of "void" type are illegal
|
||||||
|
|
||||||
|
float f_fu(uniform void aFOO[]) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
4
tests_errors/void-array-2.ispc
Normal file
4
tests_errors/void-array-2.ispc
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
// Arrays of "void" type are illegal
|
||||||
|
|
||||||
|
uniform void aFOO[] = { NULL };
|
||||||
|
|
||||||
7
tests_errors/void-array-3.ispc
Normal file
7
tests_errors/void-array-3.ispc
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
// Arrays of "void" type are illegal
|
||||||
|
|
||||||
|
struct Foo {
|
||||||
|
void aFOO[];
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
Reference in New Issue
Block a user