From 780b46fd50bde6ffddbcfac38a0037de232724c8 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Thu, 19 Feb 2009 17:31:02 +0000 Subject: [PATCH] Fix PR3619 by properly considering size modifiers and type quals when uniquing array types. llvm-svn: 65046 --- clang/include/clang/AST/Type.h | 19 +++++++++++++------ clang/lib/AST/ASTContext.cpp | 4 ++-- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/clang/include/clang/AST/Type.h b/clang/include/clang/AST/Type.h index 6da10274532a..bf36f7f6ed18 100644 --- a/clang/include/clang/AST/Type.h +++ b/clang/include/clang/AST/Type.h @@ -838,21 +838,25 @@ public: class ConstantArrayType : public ArrayType { llvm::APInt Size; // Allows us to unique the type. - ConstantArrayType(QualType et, QualType can, llvm::APInt sz, + ConstantArrayType(QualType et, QualType can, const llvm::APInt &size, ArraySizeModifier sm, unsigned tq) - : ArrayType(ConstantArray, et, can, sm, tq), Size(sz) {} + : ArrayType(ConstantArray, et, can, sm, tq), Size(size) {} friend class ASTContext; // ASTContext creates these. public: const llvm::APInt &getSize() const { return Size; } virtual void getAsStringInternal(std::string &InnerString) const; void Profile(llvm::FoldingSetNodeID &ID) { - Profile(ID, getElementType(), getSize()); + Profile(ID, getElementType(), getSize(), + getSizeModifier(), getIndexTypeQualifier()); } static void Profile(llvm::FoldingSetNodeID &ID, QualType ET, - llvm::APInt ArraySize) { + const llvm::APInt &ArraySize, ArraySizeModifier SizeMod, + unsigned TypeQuals) { ID.AddPointer(ET.getAsOpaquePtr()); ID.AddInteger(ArraySize.getZExtValue()); + ID.AddInteger(SizeMod); + ID.AddInteger(TypeQuals); } static bool classof(const Type *T) { return T->getTypeClass() == ConstantArray; @@ -885,11 +889,14 @@ public: friend class StmtIteratorBase; void Profile(llvm::FoldingSetNodeID &ID) { - Profile(ID, getElementType()); + Profile(ID, getElementType(), getSizeModifier(), getIndexTypeQualifier()); } - static void Profile(llvm::FoldingSetNodeID &ID, QualType ET) { + static void Profile(llvm::FoldingSetNodeID &ID, QualType ET, + ArraySizeModifier SizeMod, unsigned TypeQuals) { ID.AddPointer(ET.getAsOpaquePtr()); + ID.AddInteger(SizeMod); + ID.AddInteger(TypeQuals); } protected: diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp index 024fbf8968fb..5c02100ec4d8 100644 --- a/clang/lib/AST/ASTContext.cpp +++ b/clang/lib/AST/ASTContext.cpp @@ -963,7 +963,7 @@ QualType ASTContext::getConstantArrayType(QualType EltTy, ArrayType::ArraySizeModifier ASM, unsigned EltTypeQuals) { llvm::FoldingSetNodeID ID; - ConstantArrayType::Profile(ID, EltTy, ArySize); + ConstantArrayType::Profile(ID, EltTy, ArySize, ASM, EltTypeQuals); void *InsertPos = 0; if (ConstantArrayType *ATP = @@ -1031,7 +1031,7 @@ QualType ASTContext::getIncompleteArrayType(QualType EltTy, ArrayType::ArraySizeModifier ASM, unsigned EltTypeQuals) { llvm::FoldingSetNodeID ID; - IncompleteArrayType::Profile(ID, EltTy); + IncompleteArrayType::Profile(ID, EltTy, ASM, EltTypeQuals); void *InsertPos = 0; if (IncompleteArrayType *ATP =