Jonathan Wakely ef843c8271 [libc++] Fix ADL for make_error_{code,condition}
Implement LWG 3629, by making lookup for make_error_code and
make_error_condition only consider names found by ADL. This is achieved
by adding a block scope using-declaration for a function that will be
found by unqualified lookup, preventing unqualified lookup from
continuing to enclosing scopes (the class scope, then enclosing
namespaces). The function named by the using declaration is not
viable, so overload resolution must select a candidate found by ADL.

This fixes https://github.com/llvm/llvm-project/issues/57614

Differential Revision: https://reviews.llvm.org/D134943
2022-09-30 17:23:45 -04:00

42 lines
1.0 KiB
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
//
//===----------------------------------------------------------------------===//
// <system_error>
// class error_code
// template <ErrorCodeEnum E> error_code& operator=(E e);
// Regression test for https://github.com/llvm/llvm-project/issues/57614
int make_error_code; // It's important that this comes before <system_error>
#include <system_error>
#include <cassert>
#include <type_traits>
namespace user {
enum Err {};
std::error_code make_error_code(Err) { return std::error_code(42, std::generic_category()); }
}
namespace std {
template <>
struct is_error_code_enum<user::Err> : true_type {};
}
int main(int, char**) {
std::error_code e;
e = user::Err();
assert(e.value() == 42);
assert(e.category() == std::generic_category());
return 0;
}