Fixed all crashes due to refencing undefined types

Introduced UndefinedType class to replace null pointer.

Done with Roberto Raggi
This commit is contained in:
Thorbjørn Lindeijer
2009-02-10 17:20:47 +01:00
parent c721304a47
commit 146a534932
6 changed files with 42 additions and 14 deletions

View File

@@ -108,6 +108,7 @@ class QualifiedNameId;
class FullySpecifiedType; class FullySpecifiedType;
class TypeVisitor; class TypeVisitor;
class Type; class Type;
class UndefinedType;
class VoidType; class VoidType;
class IntegerType; class IntegerType;
class FloatType; class FloatType;

View File

@@ -200,30 +200,30 @@ bool CheckSpecifier::visit(SimpleSpecifierAST *ast)
break; break;
case T_CHAR: case T_CHAR:
if (_fullySpecifiedType.type()) if (_fullySpecifiedType)
translationUnit()->error(ast->specifier_token, translationUnit()->error(ast->specifier_token,
"duplicate data type in declaration"); "duplicate data type in declaration");
_fullySpecifiedType.setType(control()->integerType(IntegerType::Char)); _fullySpecifiedType.setType(control()->integerType(IntegerType::Char));
break; break;
case T_WCHAR_T: case T_WCHAR_T:
if (_fullySpecifiedType.type()) if (_fullySpecifiedType)
translationUnit()->error(ast->specifier_token, translationUnit()->error(ast->specifier_token,
"duplicate data type in declaration"); "duplicate data type in declaration");
_fullySpecifiedType.setType(control()->integerType(IntegerType::WideChar)); _fullySpecifiedType.setType(control()->integerType(IntegerType::WideChar));
break; break;
case T_BOOL: case T_BOOL:
if (_fullySpecifiedType.type()) if (_fullySpecifiedType)
translationUnit()->error(ast->specifier_token, translationUnit()->error(ast->specifier_token,
"duplicate data type in declaration"); "duplicate data type in declaration");
_fullySpecifiedType.setType(control()->integerType(IntegerType::Bool)); _fullySpecifiedType.setType(control()->integerType(IntegerType::Bool));
break; break;
case T_SHORT: case T_SHORT:
if (Type *tp = _fullySpecifiedType.type()) { if (_fullySpecifiedType) {
IntegerType *intType = control()->integerType(IntegerType::Int); IntegerType *intType = control()->integerType(IntegerType::Int);
if (tp != intType) if (_fullySpecifiedType.type() != intType)
translationUnit()->error(ast->specifier_token, translationUnit()->error(ast->specifier_token,
"duplicate data type in declaration"); "duplicate data type in declaration");
} }
@@ -231,7 +231,8 @@ bool CheckSpecifier::visit(SimpleSpecifierAST *ast)
break; break;
case T_INT: case T_INT:
if (Type *tp = _fullySpecifiedType.type()) { if (_fullySpecifiedType) {
Type *tp = _fullySpecifiedType.type();
IntegerType *shortType = control()->integerType(IntegerType::Short); IntegerType *shortType = control()->integerType(IntegerType::Short);
IntegerType *longType = control()->integerType(IntegerType::Long); IntegerType *longType = control()->integerType(IntegerType::Long);
IntegerType *longLongType = control()->integerType(IntegerType::LongLong); IntegerType *longLongType = control()->integerType(IntegerType::LongLong);
@@ -244,7 +245,8 @@ bool CheckSpecifier::visit(SimpleSpecifierAST *ast)
break; break;
case T_LONG: case T_LONG:
if (Type *tp = _fullySpecifiedType.type()) { if (_fullySpecifiedType) {
Type *tp = _fullySpecifiedType.type();
IntegerType *intType = control()->integerType(IntegerType::Int); IntegerType *intType = control()->integerType(IntegerType::Int);
IntegerType *longType = control()->integerType(IntegerType::Long); IntegerType *longType = control()->integerType(IntegerType::Long);
FloatType *doubleType = control()->floatType(FloatType::Double); FloatType *doubleType = control()->floatType(FloatType::Double);
@@ -263,16 +265,16 @@ bool CheckSpecifier::visit(SimpleSpecifierAST *ast)
break; break;
case T_FLOAT: case T_FLOAT:
if (_fullySpecifiedType.type()) if (_fullySpecifiedType)
translationUnit()->error(ast->specifier_token, translationUnit()->error(ast->specifier_token,
"duplicate data type in declaration"); "duplicate data type in declaration");
_fullySpecifiedType.setType(control()->floatType(FloatType::Float)); _fullySpecifiedType.setType(control()->floatType(FloatType::Float));
break; break;
case T_DOUBLE: case T_DOUBLE:
if (Type *tp = _fullySpecifiedType.type()) { if (_fullySpecifiedType) {
IntegerType *longType = control()->integerType(IntegerType::Long); IntegerType *longType = control()->integerType(IntegerType::Long);
if (tp == longType) { if (_fullySpecifiedType.type() == longType) {
_fullySpecifiedType.setType(control()->floatType(FloatType::LongDouble)); _fullySpecifiedType.setType(control()->floatType(FloatType::LongDouble));
break; break;
} }
@@ -283,7 +285,7 @@ bool CheckSpecifier::visit(SimpleSpecifierAST *ast)
break; break;
case T_VOID: case T_VOID:
if (_fullySpecifiedType.type()) if (_fullySpecifiedType)
translationUnit()->error(ast->specifier_token, translationUnit()->error(ast->specifier_token,
"duplicate data type in declaration"); "duplicate data type in declaration");
_fullySpecifiedType.setType(control()->voidType()); _fullySpecifiedType.setType(control()->voidType());

View File

@@ -61,6 +61,23 @@
CPLUSPLUS_BEGIN_HEADER CPLUSPLUS_BEGIN_HEADER
CPLUSPLUS_BEGIN_NAMESPACE 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 class CPLUSPLUS_EXPORT VoidType: public Type
{ {
public: public:

View File

@@ -52,18 +52,22 @@
#include "FullySpecifiedType.h" #include "FullySpecifiedType.h"
#include "Type.h" #include "Type.h"
#include "CoreTypes.h"
CPLUSPLUS_BEGIN_NAMESPACE CPLUSPLUS_BEGIN_NAMESPACE
FullySpecifiedType::FullySpecifiedType(Type *type) : FullySpecifiedType::FullySpecifiedType(Type *type) :
_type(type), _flags(0) _type(type), _flags(0)
{ } {
if (! type)
_type = UndefinedType::instance();
}
FullySpecifiedType::~FullySpecifiedType() FullySpecifiedType::~FullySpecifiedType()
{ } { }
bool FullySpecifiedType::isValid() const bool FullySpecifiedType::isValid() const
{ return _type != 0; } { return _type != UndefinedType::instance(); }
Type *FullySpecifiedType::type() const Type *FullySpecifiedType::type() const
{ return _type; } { return _type; }
@@ -177,7 +181,7 @@ Type &FullySpecifiedType::operator*()
{ return *_type; } { return *_type; }
FullySpecifiedType::operator bool() const FullySpecifiedType::operator bool() const
{ return _type != 0; } { return _type != UndefinedType::instance(); }
const Type &FullySpecifiedType::operator*() const const Type &FullySpecifiedType::operator*() const
{ return *_type; } { return *_type; }

View File

@@ -63,6 +63,9 @@ Type::Type()
Type::~Type() Type::~Type()
{ } { }
bool Type::isUndefinedType() const
{ return this == UndefinedType::instance(); }
bool Type::isVoidType() const bool Type::isVoidType() const
{ return asVoidType() != 0; } { return asVoidType() != 0; }

View File

@@ -67,6 +67,7 @@ public:
Type(); Type();
virtual ~Type(); virtual ~Type();
bool isUndefinedType() const;
bool isVoidType() const; bool isVoidType() const;
bool isIntegerType() const; bool isIntegerType() const;
bool isFloatType() const; bool isFloatType() const;