Commit 146a5349 authored by Thorbjørn Lindeijer's avatar Thorbjørn Lindeijer
Browse files

Fixed all crashes due to refencing undefined types

Introduced UndefinedType class to replace null pointer.

Done with Roberto Raggi
parent c721304a
......@@ -108,6 +108,7 @@ class QualifiedNameId;
class FullySpecifiedType;
class TypeVisitor;
class Type;
class UndefinedType;
class VoidType;
class IntegerType;
class FloatType;
......
......@@ -200,30 +200,30 @@ bool CheckSpecifier::visit(SimpleSpecifierAST *ast)
break;
case T_CHAR:
if (_fullySpecifiedType.type())
if (_fullySpecifiedType)
translationUnit()->error(ast->specifier_token,
"duplicate data type in declaration");
_fullySpecifiedType.setType(control()->integerType(IntegerType::Char));
break;
case T_WCHAR_T:
if (_fullySpecifiedType.type())
if (_fullySpecifiedType)
translationUnit()->error(ast->specifier_token,
"duplicate data type in declaration");
_fullySpecifiedType.setType(control()->integerType(IntegerType::WideChar));
break;
case T_BOOL:
if (_fullySpecifiedType.type())
if (_fullySpecifiedType)
translationUnit()->error(ast->specifier_token,
"duplicate data type in declaration");
_fullySpecifiedType.setType(control()->integerType(IntegerType::Bool));
break;
case T_SHORT:
if (Type *tp = _fullySpecifiedType.type()) {
if (_fullySpecifiedType) {
IntegerType *intType = control()->integerType(IntegerType::Int);
if (tp != intType)
if (_fullySpecifiedType.type() != intType)
translationUnit()->error(ast->specifier_token,
"duplicate data type in declaration");
}
......@@ -231,7 +231,8 @@ bool CheckSpecifier::visit(SimpleSpecifierAST *ast)
break;
case T_INT:
if (Type *tp = _fullySpecifiedType.type()) {
if (_fullySpecifiedType) {
Type *tp = _fullySpecifiedType.type();
IntegerType *shortType = control()->integerType(IntegerType::Short);
IntegerType *longType = control()->integerType(IntegerType::Long);
IntegerType *longLongType = control()->integerType(IntegerType::LongLong);
......@@ -244,7 +245,8 @@ bool CheckSpecifier::visit(SimpleSpecifierAST *ast)
break;
case T_LONG:
if (Type *tp = _fullySpecifiedType.type()) {
if (_fullySpecifiedType) {
Type *tp = _fullySpecifiedType.type();
IntegerType *intType = control()->integerType(IntegerType::Int);
IntegerType *longType = control()->integerType(IntegerType::Long);
FloatType *doubleType = control()->floatType(FloatType::Double);
......@@ -263,16 +265,16 @@ bool CheckSpecifier::visit(SimpleSpecifierAST *ast)
break;
case T_FLOAT:
if (_fullySpecifiedType.type())
if (_fullySpecifiedType)
translationUnit()->error(ast->specifier_token,
"duplicate data type in declaration");
_fullySpecifiedType.setType(control()->floatType(FloatType::Float));
break;
case T_DOUBLE:
if (Type *tp = _fullySpecifiedType.type()) {
if (_fullySpecifiedType) {
IntegerType *longType = control()->integerType(IntegerType::Long);
if (tp == longType) {
if (_fullySpecifiedType.type() == longType) {
_fullySpecifiedType.setType(control()->floatType(FloatType::LongDouble));
break;
}
......@@ -283,7 +285,7 @@ bool CheckSpecifier::visit(SimpleSpecifierAST *ast)
break;
case T_VOID:
if (_fullySpecifiedType.type())
if (_fullySpecifiedType)
translationUnit()->error(ast->specifier_token,
"duplicate data type in declaration");
_fullySpecifiedType.setType(control()->voidType());
......
......@@ -61,6 +61,23 @@
CPLUSPLUS_BEGIN_HEADER
CPLUSPLUS_BEGIN_NAMESPACE
class CPLUSPLUS_EXPORT UndefinedType : public Type
{
public:
static UndefinedType *instance()
{
static UndefinedType t;
return &t;
}
virtual bool isEqualTo(const Type *other) const
{ return this == other; }
protected:
virtual void accept0(TypeVisitor *)
{ }
};
class CPLUSPLUS_EXPORT VoidType: public Type
{
public:
......
......@@ -52,18 +52,22 @@
#include "FullySpecifiedType.h"
#include "Type.h"
#include "CoreTypes.h"
CPLUSPLUS_BEGIN_NAMESPACE
FullySpecifiedType::FullySpecifiedType(Type *type) :
_type(type), _flags(0)
{ }
{
if (! type)
_type = UndefinedType::instance();
}
FullySpecifiedType::~FullySpecifiedType()
{ }
bool FullySpecifiedType::isValid() const
{ return _type != 0; }
{ return _type != UndefinedType::instance(); }
Type *FullySpecifiedType::type() const
{ return _type; }
......@@ -177,7 +181,7 @@ Type &FullySpecifiedType::operator*()
{ return *_type; }
FullySpecifiedType::operator bool() const
{ return _type != 0; }
{ return _type != UndefinedType::instance(); }
const Type &FullySpecifiedType::operator*() const
{ return *_type; }
......
......@@ -63,6 +63,9 @@ Type::Type()
Type::~Type()
{ }
bool Type::isUndefinedType() const
{ return this == UndefinedType::instance(); }
bool Type::isVoidType() const
{ return asVoidType() != 0; }
......
......@@ -67,6 +67,7 @@ public:
Type();
virtual ~Type();
bool isUndefinedType() const;
bool isVoidType() const;
bool isIntegerType() const;
bool isFloatType() const;
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment