// RUN: %clang_cc1 -std=c++1z -verify %s
using Fn = noexcept;
// - If the original A is a function pointer type, A can be "pointer to
// function" even if the deduced A is "pointer to noexcept function".
;
;
void = ;
void = ;
void noexcept = ; // expected-error {{no viable conversion}}
void noexcept = ;
// - If the original A is a pointer to member function type, A can be "pointer
// to member of type function" even if the deduced A is "pointer to member of
// type noexcept function".
;
;
void = ;
void = ;
void noexcept = ; // expected-error {{no viable conversion}}
void noexcept = ;
// There is no corresponding rule for references.
// FIXME: This seems like a defect.
// FIXME: We don't actually implement the final check for equal types at all!
// Instead, we handle the matching via [over.ics.user]p3:
// "If the user-defined conversion is specified by a specialization of a
// conversion function template, the second standard conversion sequence
// shall have exact match rank."
// Note that this *does* allow discarding noexcept, since that conversion has
// Exact Match rank.
;
;
void = ;
void = ;
void noexcept = ; // expected-error {{no viable conversion}}
void noexcept = ;
// FIXME: We reject this for entirely the wrong reason. We incorrectly succeed
// in deducing T = void, U = G::B, and only fail due to [over.ics.user]p3.
;
G::A<void, void> *g = ; // expected-error {{no viable conversion}}