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;