forked from qt-creator/qt-creator
Fixed all crashes due to refencing undefined types
Introduced UndefinedType class to replace null pointer. Done with Roberto Raggi
This commit is contained in:
@@ -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;
|
||||||
|
@@ -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());
|
||||||
|
@@ -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:
|
||||||
|
@@ -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; }
|
||||||
|
@@ -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; }
|
||||||
|
|
||||||
|
@@ -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;
|
||||||
|
Reference in New Issue
Block a user