From: Anders Carlsson Date: Thu, 4 Nov 2010 05:28:09 +0000 (+0000) Subject: std::nullptr_t is a fundamental type for RTTI purposes. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=2bd6250f8e14750033362664ee298c2cc0e64853;p=clang std::nullptr_t is a fundamental type for RTTI purposes. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@118238 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/CGRTTI.cpp b/lib/CodeGen/CGRTTI.cpp index 2e527d084c..7a7195aac4 100644 --- a/lib/CodeGen/CGRTTI.cpp +++ b/lib/CodeGen/CGRTTI.cpp @@ -187,13 +187,14 @@ static bool TypeInfoIsInStandardLibrary(const BuiltinType *Ty) { // Basic type information (e.g. for "int", "bool", etc.) will be kept in // the run-time support library. Specifically, the run-time support // library should contain type_info objects for the types X, X* and - // X const*, for every X in: void, bool, wchar_t, char, unsigned char, - // signed char, short, unsigned short, int, unsigned int, long, - // unsigned long, long long, unsigned long long, float, double, long double, - // char16_t, char32_t, and the IEEE 754r decimal and half-precision - // floating point types. + // X const*, for every X in: void, std::nullptr_t, bool, wchar_t, char, + // unsigned char, signed char, short, unsigned short, int, unsigned int, + // long, unsigned long, long long, unsigned long long, float, double, + // long double, char16_t, char32_t, and the IEEE 754r decimal and + // half-precision floating point types. switch (Ty->getKind()) { case BuiltinType::Void: + case BuiltinType::NullPtr: case BuiltinType::Bool: case BuiltinType::WChar: case BuiltinType::Char_U: @@ -222,9 +223,6 @@ static bool TypeInfoIsInStandardLibrary(const BuiltinType *Ty) { case BuiltinType::UndeducedAuto: assert(false && "Should not see this type here!"); - case BuiltinType::NullPtr: - assert(false && "FIXME: nullptr_t is not handled!"); - case BuiltinType::ObjCId: case BuiltinType::ObjCClass: case BuiltinType::ObjCSel: @@ -934,16 +932,16 @@ void CodeGenModule::EmitFundamentalRTTIDescriptor(QualType Type) { } void CodeGenModule::EmitFundamentalRTTIDescriptors() { - QualType FundamentalTypes[] = { Context.VoidTy, Context.Char32Ty, - Context.Char16Ty, Context.UnsignedLongLongTy, - Context.LongLongTy, Context.WCharTy, - Context.UnsignedShortTy, Context.ShortTy, - Context.UnsignedLongTy, Context.LongTy, - Context.UnsignedIntTy, Context.IntTy, - Context.UnsignedCharTy, Context.FloatTy, - Context.LongDoubleTy, Context.DoubleTy, - Context.CharTy, Context.BoolTy, - Context.SignedCharTy }; + QualType FundamentalTypes[] = { Context.VoidTy, Context.NullPtrTy, + Context.BoolTy, Context.WCharTy, + Context.CharTy, Context.UnsignedCharTy, + Context.SignedCharTy, Context.ShortTy, + Context.UnsignedShortTy, Context.IntTy, + Context.UnsignedIntTy, Context.LongTy, + Context.UnsignedLongTy, Context.LongLongTy, + Context.UnsignedLongLongTy, Context.FloatTy, + Context.DoubleTy, Context.LongDoubleTy, + Context.Char16Ty, Context.Char32Ty }; for (unsigned i = 0; i < sizeof(FundamentalTypes)/sizeof(QualType); ++i) EmitFundamentalRTTIDescriptor(FundamentalTypes[i]); } diff --git a/lib/Sema/SemaOverload.cpp b/lib/Sema/SemaOverload.cpp index 9fb53c6a18..af00464859 100644 --- a/lib/Sema/SemaOverload.cpp +++ b/lib/Sema/SemaOverload.cpp @@ -986,7 +986,7 @@ static bool IsStandardConversion(Sema &S, Expr* From, QualType ToType, } else { return false; } - } + } // Lvalue-to-rvalue conversion (C++ 4.1): // An lvalue (3.10) of a non-function, non-array type T can be // converted to an rvalue. diff --git a/test/CodeGenCXX/nullptr.cpp b/test/CodeGenCXX/nullptr.cpp index ab63b432bd..0dca68f8bc 100644 --- a/test/CodeGenCXX/nullptr.cpp +++ b/test/CodeGenCXX/nullptr.cpp @@ -1,5 +1,8 @@ // RUN: %clang_cc1 -std=c++0x -triple x86_64-apple-darwin10 -emit-llvm -o - %s | FileCheck %s +#include + +// CHECK: @_ZTIDn = external constant i8* int* a = nullptr; void f() { @@ -15,3 +18,7 @@ void g() { // CHECK: call i8* @_Z11get_nullptrv() int (X::*pmf)(int) = get_nullptr(); } + +const std::type_info& f2() { + return typeid(nullptr_t); +} \ No newline at end of file diff --git a/test/CodeGenCXX/rtti-fundamental.cpp b/test/CodeGenCXX/rtti-fundamental.cpp index 7f80d99b70..14297b68cf 100644 --- a/test/CodeGenCXX/rtti-fundamental.cpp +++ b/test/CodeGenCXX/rtti-fundamental.cpp @@ -14,60 +14,103 @@ namespace __cxxabiv1 { __fundamental_type_info::~__fundamental_type_info() { } } +// void // CHECK: @_ZTIv = constant // CHECK: @_ZTIPv = constant // CHECK: @_ZTIPKv = constant -// CHECK: @_ZTIDi = constant -// CHECK: @_ZTIPDi = constant -// CHECK: @_ZTIPKDi = constant -// CHECK: @_ZTIDs = constant -// CHECK: @_ZTIPDs = constant -// CHECK: @_ZTIPKDs = constant -// CHECK: @_ZTIy = constant -// CHECK: @_ZTIPy = constant -// CHECK: @_ZTIPKy = constant -// CHECK: @_ZTIx = constant -// CHECK: @_ZTIPx = constant -// CHECK: @_ZTIPKx = constant + +// std::nullptr_t +// CHECK: @_ZTIDn = constant +// CHECK: @_ZTIPDn = constant +// CHECK: @_ZTIPKDn = constant + +// bool +// CHECK: @_ZTIb = constant +// CHECK: @_ZTIPb = constant +// CHECK: @_ZTIPKb = constant + +// wchar_t // CHECK: @_ZTIw = constant // CHECK: @_ZTIPw = constant // CHECK: @_ZTIPKw = constant -// CHECK: @_ZTIt = constant -// CHECK: @_ZTIPt = constant -// CHECK: @_ZTIPKt = constant + +// char +// CHECK: @_ZTIc = constant +// CHECK: @_ZTIPc = constant +// CHECK: @_ZTIPKc = constant + +// unsigned char +// CHECK: @_ZTIh = constant +// CHECK: @_ZTIPh = constant +// CHECK: @_ZTIPKh = constant + +// signed char +// CHECK: @_ZTIa = constant +// CHECK: @_ZTIPa = constant +// CHECK: @_ZTIPKa = constant + +// short // CHECK: @_ZTIs = constant // CHECK: @_ZTIPs = constant // CHECK: @_ZTIPKs = constant -// CHECK: @_ZTIm = constant -// CHECK: @_ZTIPm = constant -// CHECK: @_ZTIPKm = constant -// CHECK: @_ZTIl = constant -// CHECK: @_ZTIPl = constant -// CHECK: @_ZTIPKl = constant -// CHECK: @_ZTIj = constant -// CHECK: @_ZTIPj = constant -// CHECK: @_ZTIPKj = constant + +// unsigned short +// CHECK: @_ZTIt = constant +// CHECK: @_ZTIPt = constant +// CHECK: @_ZTIPKt = constant + +// int // CHECK: @_ZTIi = constant // CHECK: @_ZTIPi = constant // CHECK: @_ZTIPKi = constant -// CHECK: @_ZTIh = constant -// CHECK: @_ZTIPh = constant -// CHECK: @_ZTIPKh = constant + +// unsigned int +// CHECK: @_ZTIj = constant +// CHECK: @_ZTIPj = constant +// CHECK: @_ZTIPKj = constant + +// long +// CHECK: @_ZTIl = constant +// CHECK: @_ZTIPl = constant +// CHECK: @_ZTIPKl = constant + +// unsigned long +// CHECK: @_ZTIm = constant +// CHECK: @_ZTIPm = constant +// CHECK: @_ZTIPKm = constant + +// long long +// CHECK: @_ZTIx = constant +// CHECK: @_ZTIPx = constant +// CHECK: @_ZTIPKx = constant + +// unsigned long long +// CHECK: @_ZTIy = constant +// CHECK: @_ZTIPy = constant +// CHECK: @_ZTIPKy = constant + +// float // CHECK: @_ZTIf = constant // CHECK: @_ZTIPf = constant // CHECK: @_ZTIPKf = constant -// CHECK: @_ZTIe = constant -// CHECK: @_ZTIPe = constant -// CHECK: @_ZTIPKe = constant + +// double // CHECK: @_ZTId = constant // CHECK: @_ZTIPd = constant // CHECK: @_ZTIPKd = constant -// CHECK: @_ZTIc = constant -// CHECK: @_ZTIPc = constant -// CHECK: @_ZTIPKc = constant -// CHECK: @_ZTIb = constant -// CHECK: @_ZTIPb = constant -// CHECK: @_ZTIPKb = constant -// CHECK: @_ZTIa = constant -// CHECK: @_ZTIPa = constant -// CHECK: @_ZTIPKa = constant + +// long double +// CHECK: @_ZTIe = constant +// CHECK: @_ZTIPe = constant +// CHECK: @_ZTIPKe = constant + +// char16_t +// CHECK: @_ZTIDs = constant +// CHECK: @_ZTIPDs = constant +// CHECK: @_ZTIPKDs = constant + +// char32_t +// CHECK: @_ZTIDi = constant +// CHECK: @_ZTIPDi = constant +// CHECK: @_ZTIPKDi = constant +