From: Douglas Gregor Date: Mon, 3 Nov 2008 14:12:49 +0000 (+0000) Subject: Connect ASTContext to TargetInfo when determining the size_t, ptrdiff_t, and wchar_t... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b4e66d5259f90e9aae4d40fc5de801e046c7df94;p=clang Connect ASTContext to TargetInfo when determining the size_t, ptrdiff_t, and wchar_t types. Fixes recent breakage on Linux. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@58609 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/AST/ASTContext.h b/include/clang/AST/ASTContext.h index b30fbfa444..9f3d690683 100644 --- a/include/clang/AST/ASTContext.h +++ b/include/clang/AST/ASTContext.h @@ -15,6 +15,7 @@ #define LLVM_CLANG_AST_ASTCONTEXT_H #include "clang/Basic/LangOptions.h" +#include "clang/Basic/TargetInfo.h" #include "clang/AST/Builtins.h" #include "clang/AST/DeclBase.h" #include "clang/AST/Type.h" @@ -33,7 +34,6 @@ namespace clang { class ASTRecordLayout; class Expr; class IdentifierTable; - class TargetInfo; class SelectorTable; class SourceManager; // Decls @@ -319,6 +319,8 @@ public: void setBuiltinVaListType(QualType T); QualType getBuiltinVaListType() const { return BuiltinVaListType; } + QualType getFromTargetType(TargetInfo::IntType Type) const; + //===--------------------------------------------------------------------===// // Type Predicates. //===--------------------------------------------------------------------===// diff --git a/lib/AST/ASTContext.cpp b/lib/AST/ASTContext.cpp index 095414bde1..0e250281a0 100644 --- a/lib/AST/ASTContext.cpp +++ b/lib/AST/ASTContext.cpp @@ -1090,9 +1090,7 @@ QualType ASTContext::getTagDeclType(TagDecl *Decl) { /// of the sizeof operator (C99 6.5.3.4p4). The value is target dependent and /// needs to agree with the definition in . QualType ASTContext::getSizeType() const { - // On Darwin, size_t is defined as a "long unsigned int". - // FIXME: should derive from "Target". - return UnsignedLongTy; + return getFromTargetType(Target.getSizeType()); } /// getWCharType - Return the unique type for "wchar_t" (C99 7.17), the @@ -1102,9 +1100,9 @@ QualType ASTContext::getWCharType() const { if (LangOpts.CPlusPlus) return WCharTy; - // On Darwin, wchar_t is defined as a "int". - // FIXME: should derive from "Target". - return IntTy; + // FIXME: In C, shouldn't WCharTy just be a typedef of the target's + // wide-character type? + return getFromTargetType(Target.getWCharType()); } /// getSignedWCharType - Return the type of "signed wchar_t". @@ -1124,9 +1122,7 @@ QualType ASTContext::getUnsignedWCharType() const { /// getPointerDiffType - Return the unique type for "ptrdiff_t" (ref?) /// defined in . Pointer - pointer requires this (C99 6.5.6p9). QualType ASTContext::getPointerDiffType() const { - // On Darwin, ptrdiff_t is defined as a "int". This seems like a bug... - // FIXME: should derive from "Target". - return IntTy; + return getFromTargetType(Target.getPtrDiffType(0)); } //===----------------------------------------------------------------------===// @@ -1796,6 +1792,23 @@ void ASTContext::setObjCConstantStringInterface(ObjCInterfaceDecl *Decl) { ObjCConstantStringType = getObjCInterfaceType(Decl); } +/// getFromTargetType - Given one of the integer types provided by +/// TargetInfo, produce the corresponding type. +QualType ASTContext::getFromTargetType(TargetInfo::IntType Type) const { + switch (Type) { + case TargetInfo::NoInt: return QualType(); + case TargetInfo::SignedShort: return ShortTy; + case TargetInfo::UnsignedShort: return UnsignedShortTy; + case TargetInfo::SignedInt: return IntTy; + case TargetInfo::UnsignedInt: return UnsignedIntTy; + case TargetInfo::SignedLong: return LongTy; + case TargetInfo::UnsignedLong: return UnsignedLongTy; + case TargetInfo::SignedLongLong: return LongLongTy; + case TargetInfo::UnsignedLongLong: return UnsignedLongLongTy; + } + + assert(false && "Unhandled TargetInfo::IntType value"); +} //===----------------------------------------------------------------------===// // Type Predicates.