Implement [over.ics.rank]p4: A conversion that does not convert an std::nullptr_t to bool is better than one than does.

llvm-svn: 118269
This commit is contained in:
Anders Carlsson 2010-11-05 00:12:09 +00:00
parent f7f4f50113
commit 7da7cc568f
2 changed files with 18 additions and 2 deletions

View File

@ -190,6 +190,7 @@ bool StandardConversionSequence::isPointerConversionToBool() const {
(getFromType()->isPointerType() ||
getFromType()->isObjCObjectPointerType() ||
getFromType()->isBlockPointerType() ||
getFromType()->isNullPtrType() ||
First == ICK_Array_To_Pointer || First == ICK_Function_To_Pointer))
return true;

View File

@ -1,8 +1,7 @@
// RUN: %clang_cc1 -fsyntax-only -verify -std=c++0x -ffreestanding %s
#include <stdint.h>
// Don't have decltype yet.
typedef __typeof__(nullptr) nullptr_t;
typedef decltype(nullptr) nullptr_t;
struct A {};
@ -69,3 +68,19 @@ template <int *PI, void (*PF)(), int A::*PM, void (A::*PMF)()>
struct T {};
typedef T<nullptr, nullptr, nullptr, nullptr> NT;
namespace test1 {
template<typename T, typename U> struct is_same {
static const bool value = false;
};
template<typename T> struct is_same<T, T> {
static const bool value = true;
};
void *g(void*);
bool g(bool);
// Test that we prefer g(void*) over g(bool).
static_assert(is_same<decltype(g(nullptr)), void*>::value, "");
}