PR c++/71117 - core 2189 and generic lambda

* call.c (add_template_conv_candidate): Disable if there are
	viable candidates.

From-SVN: r238394
This commit is contained in:
Jason Merrill 2016-07-15 14:49:25 -04:00 committed by Jason Merrill
parent 2a54351ba7
commit 4d031550cc
4 changed files with 38 additions and 0 deletions

View File

@ -1,5 +1,10 @@
2016-07-15 Jason Merrill <jason@redhat.com> 2016-07-15 Jason Merrill <jason@redhat.com>
PR c++/71117
Core 2189
* call.c (add_template_conv_candidate): Disable if there are
viable candidates.
PR c++/71511 PR c++/71511
* typeck2.c (cxx_incomplete_type_diagnostic): Handle DECLTYPE_TYPE. * typeck2.c (cxx_incomplete_type_diagnostic): Handle DECLTYPE_TYPE.

View File

@ -3204,6 +3204,12 @@ add_template_conv_candidate (struct z_candidate **candidates, tree tmpl,
tree return_type, tree access_path, tree return_type, tree access_path,
tree conversion_path, tsubst_flags_t complain) tree conversion_path, tsubst_flags_t complain)
{ {
/* Making this work broke PR 71117, so until the committee resolves core
issue 2189, let's disable this candidate if there are any viable call
operators. */
if (any_strictly_viable (*candidates))
return NULL;
return return
add_template_candidate_real (candidates, tmpl, NULL_TREE, NULL_TREE, add_template_candidate_real (candidates, tmpl, NULL_TREE, NULL_TREE,
NULL_TREE, arglist, return_type, access_path, NULL_TREE, arglist, return_type, access_path,

View File

@ -1,3 +1,4 @@
// Test for Core 2189.
// { dg-do compile { target c++11 } } // { dg-do compile { target c++11 } }
template <class T> template <class T>

View File

@ -0,0 +1,26 @@
// PR c++/71117
// { dg-do compile { target c++14 } }
template <class T> T&& declval() noexcept;
template <class, class>
constexpr bool is_same = false;
template <class T>
constexpr bool is_same<T, T> = true;
template <class F>
struct indirected : F {
indirected(F f) : F(f) {}
template <class I>
auto operator()(I i) -> decltype(declval<F&>()(*i)) {
return static_cast<F&>(*this)(*i);
}
};
int main() {
auto f = [](auto rng) {
static_assert(is_same<decltype(rng), int>, "");
return 42;
};
indirected<decltype(f)> i(f);
static_assert(is_same<decltype(i(declval<int*>())), int>, "");
}