diff --git a/src/shared/cplusplus/CPlusPlusForwardDeclarations.h b/src/shared/cplusplus/CPlusPlusForwardDeclarations.h index 31b01bfd815d4644a1ae34d9f370ec95400a7d97..2909c0775ab2a90b3bd105214175c9acf664ae38 100644 --- a/src/shared/cplusplus/CPlusPlusForwardDeclarations.h +++ b/src/shared/cplusplus/CPlusPlusForwardDeclarations.h @@ -108,6 +108,7 @@ class QualifiedNameId; class FullySpecifiedType; class TypeVisitor; class Type; +class UndefinedType; class VoidType; class IntegerType; class FloatType; diff --git a/src/shared/cplusplus/CheckSpecifier.cpp b/src/shared/cplusplus/CheckSpecifier.cpp index 20a3662e7b8c8b770de4fe8d0fcef3f54a6356f6..fddfd525689a439a4b5a1e9d51cdf62be16ee7a5 100644 --- a/src/shared/cplusplus/CheckSpecifier.cpp +++ b/src/shared/cplusplus/CheckSpecifier.cpp @@ -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()); diff --git a/src/shared/cplusplus/CoreTypes.h b/src/shared/cplusplus/CoreTypes.h index 42895f4dba3dde739a0f11d9cef61f4c0b7c7f58..f859fbf300be2c332d10e0ddd463a09507699b8b 100644 --- a/src/shared/cplusplus/CoreTypes.h +++ b/src/shared/cplusplus/CoreTypes.h @@ -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: diff --git a/src/shared/cplusplus/FullySpecifiedType.cpp b/src/shared/cplusplus/FullySpecifiedType.cpp index 71dec2934bce0a229179203fdf664b27d84d55b7..0afcdd0d7541debe298f96fb38e409529731de4f 100644 --- a/src/shared/cplusplus/FullySpecifiedType.cpp +++ b/src/shared/cplusplus/FullySpecifiedType.cpp @@ -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; } diff --git a/src/shared/cplusplus/Type.cpp b/src/shared/cplusplus/Type.cpp index 52d51b57bdb89af06bd6a67b6658e8295e16d481..b88b0afab4881efe7ad7f8a185b55b2fb6fd77df 100644 --- a/src/shared/cplusplus/Type.cpp +++ b/src/shared/cplusplus/Type.cpp @@ -63,6 +63,9 @@ Type::Type() Type::~Type() { } +bool Type::isUndefinedType() const +{ return this == UndefinedType::instance(); } + bool Type::isVoidType() const { return asVoidType() != 0; } diff --git a/src/shared/cplusplus/Type.h b/src/shared/cplusplus/Type.h index dd22c982c249d7e1f963551b831cd932dd453547..320555b40cfd96cf0f7a2f47c87a7d97d1f30a8c 100644 --- a/src/shared/cplusplus/Type.h +++ b/src/shared/cplusplus/Type.h @@ -67,6 +67,7 @@ public: Type(); virtual ~Type(); + bool isUndefinedType() const; bool isVoidType() const; bool isIntegerType() const; bool isFloatType() const;