#include "absl/base/casts.h"
#include <cstdlib>
#include <string>
#include "absl/base/config.h"
#include "absl/base/internal/raw_logging.h"
#ifdef ABSL_INTERNAL_HAS_CXA_DEMANGLE
#include <cxxabi.h>
#endif
namespace absl {
ABSL_NAMESPACE_BEGIN
namespace base_internal {
namespace {
std::string DemangleCppString(const char* mangled) {
std::string out;
int status = 0;
char* demangled = nullptr;
#ifdef ABSL_INTERNAL_HAS_CXA_DEMANGLE
demangled = abi::__cxa_demangle(mangled, nullptr, nullptr, &status);
#endif
if (status == 0 && demangled != nullptr) {
out.append(demangled);
free(demangled);
} else {
out.append(mangled);
}
return out;
}
}
void BadDownCastCrash(const char* source_type, const char* target_type) {
ABSL_RAW_LOG(FATAL, "down cast from %s to %s failed",
DemangleCppString(source_type).c_str(),
DemangleCppString(target_type).c_str());
}
}
ABSL_NAMESPACE_END
}