diff --git a/expr.cpp b/expr.cpp index 5bc055fa..67e8a819 100644 --- a/expr.cpp +++ b/expr.cpp @@ -4277,11 +4277,19 @@ IndexExpr::TypeCheck() { return NULL; } - if (!CastType(baseExprType->GetReferenceTarget()) && - !CastType(baseExprType)) { - Error(pos, "Trying to index into non-array, vector, or pointer " + if (!CastType(baseExprType->GetReferenceTarget())) { + if (const PointerType *pt = CastType(baseExprType)) { + if (Type::Equal(AtomicType::Void, pt->GetBaseType())) { + Error(pos, "Illegal to dereference void pointer type \"%s\".", + baseExprType->GetString().c_str()); + return NULL; + } + } + else { + Error(pos, "Trying to index into non-array, vector, or pointer " "type \"%s\".", baseExprType->GetString().c_str()); - return NULL; + return NULL; + } } bool isUniform = (index->GetType()->IsUniformType() && @@ -7172,7 +7180,14 @@ PtrDerefExpr::TypeCheck() { return NULL; } - if (CastType(type) == NULL) { + if (const PointerType *pt = CastType(type)) { + if (Type::Equal(AtomicType::Void, pt->GetBaseType())) { + Error(pos, "Illegal to dereference void pointer type \"%s\".", + type->GetString().c_str()); + return NULL; + } + } + else { Error(pos, "Illegal to dereference non-pointer type \"%s\".", type->GetString().c_str()); return NULL; diff --git a/tests_errors/void-ptr-deref-1.ispc b/tests_errors/void-ptr-deref-1.ispc new file mode 100644 index 00000000..8928b7db --- /dev/null +++ b/tests_errors/void-ptr-deref-1.ispc @@ -0,0 +1,5 @@ +// Illegal to dereference void pointer type + +int foo(void * uniform ptr) { + print("%", ptr[0]); +} diff --git a/tests_errors/void-ptr-deref.ispc b/tests_errors/void-ptr-deref.ispc new file mode 100644 index 00000000..b4f013b9 --- /dev/null +++ b/tests_errors/void-ptr-deref.ispc @@ -0,0 +1,5 @@ +// Illegal to dereference void pointer type + +int foo(void * uniform ptr) { + print("%", *ptr); +}