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