// -*- C++ -*-
//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#ifndef _LIBCPP_SOURCE_LOCATION
#define _LIBCPP_SOURCE_LOCATION

/* source_location synopsis

namespace std {
  struct source_location {
    static consteval source_location current() noexcept;
    constexpr source_location() noexcept;

    constexpr uint_least32_t line() const noexcept;
    constexpr uint_least32_t column() const noexcept;
    constexpr const char* file_name() const noexcept;
    constexpr const char* function_name() const noexcept;
  };
}
*/

#include <__config>
#include <cstdint>
#include <version>

#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
#  pragma GCC system_header
#endif

_LIBCPP_BEGIN_NAMESPACE_STD

#if _LIBCPP_STD_VER >= 20 && __has_builtin(__builtin_source_location) &&                                               \
    !(defined(_LIBCPP_APPLE_CLANG_VER) && _LIBCPP_APPLE_CLANG_VER <= 1403)

class source_location {
  // The names source_location::__impl, _M_file_name, _M_function_name, _M_line, and _M_column
  // are hard-coded in the compiler and must not be changed here.
  struct __impl {
    const char* _M_file_name;
    const char* _M_function_name;
    unsigned _M_line;
    unsigned _M_column;
  };
  const __impl* __ptr_ = nullptr;
  // GCC returns the type 'const void*' from the builtin, while clang returns
  // `const __impl*`. Per C++ [expr.const], casts from void* are not permitted
  // in constant evaluation, so we don't want to use `void*` as the argument
  // type unless the builtin returned that, anyhow, and the invalid cast is
  // unavoidable.
  using __bsl_ty = decltype(__builtin_source_location());

public:
  // The defaulted __ptr argument is necessary so that the builtin is evaluated
  // in the context of the caller. An explicit value should never be provided.
  static consteval source_location current(__bsl_ty __ptr = __builtin_source_location()) noexcept {
    source_location __sl;
    __sl.__ptr_ = static_cast<const __impl*>(__ptr);
    return __sl;
  }
  _LIBCPP_HIDE_FROM_ABI constexpr source_location() noexcept = default;

  _LIBCPP_HIDE_FROM_ABI constexpr uint_least32_t line() const noexcept {
    return __ptr_ != nullptr ? __ptr_->_M_line : 0;
  }
  _LIBCPP_HIDE_FROM_ABI constexpr uint_least32_t column() const noexcept {
    return __ptr_ != nullptr ? __ptr_->_M_column : 0;
  }
  _LIBCPP_HIDE_FROM_ABI constexpr const char* file_name() const noexcept {
    return __ptr_ != nullptr ? __ptr_->_M_file_name : "";
  }
  _LIBCPP_HIDE_FROM_ABI constexpr const char* function_name() const noexcept {
    return __ptr_ != nullptr ? __ptr_->_M_function_name : "";
  }
};

#endif // _LIBCPP_STD_VER >= 20 && __has_builtin(__builtin_source_location) && !(defined(_LIBCPP_APPLE_CLANG_VER) &&
       // _LIBCPP_APPLE_CLANG_VER <= 1403)

_LIBCPP_END_NAMESPACE_STD

#endif // _LIBCPP_SOURCE_LOCATION
