Commit 4fae7917 authored by Eric Fiselier's avatar Eric Fiselier
Browse files

Merge r292294: Fix type_info's constructor by making it explicit again.

In recent changes type_info's private constructor was accidentally made
implicit. This patch fixes that.

llvm-svn: 292309
parent 759bf087
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -95,12 +95,13 @@ protected:
    uintptr_t __type_name;

    _LIBCPP_INLINE_VISIBILITY
    type_info(const char* __n) : __type_name(reinterpret_cast<uintptr_t>(__n)) {}
    explicit type_info(const char* __n)
      : __type_name(reinterpret_cast<uintptr_t>(__n)) {}
#else
    const char *__type_name;

    _LIBCPP_INLINE_VISIBILITY
    type_info(const char* __n) : __type_name(__n) {}
    explicit type_info(const char* __n) : __type_name(__n) {}
#endif

public:
+14 −0
Original line number Diff line number Diff line
@@ -10,10 +10,15 @@
// test type_info

#include <typeinfo>
#include <string>
#include <cstring>
#include <cassert>

bool test_constructor_explicit(std::type_info const&) { return false; }
bool test_constructor_explicit(std::string const&) { return true; }

int main()
{
  {
    const std::type_info& t1 = typeid(int);
    const std::type_info& t2 = typeid(int);
@@ -24,3 +29,12 @@ int main()
    assert(strcmp(t1.name(), t2.name()) == 0);
    assert(strcmp(t1.name(), t3.name()) != 0);
  }
  {
    // type_info has a protected constructor taking a string literal. This
    // constructor is not intended for users. However it still participates
    // in overload resolution, so we need to ensure that it is marked explicit
    // to avoid ambiguous conversions.
    // See: https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=216201
    assert(test_constructor_explicit("abc"));
  }
}