PR c++/81236 - auto variable and auto function

* pt.c (tsubst_baselink): Update the type of the BASELINK after
	mark_used.

From-SVN: r258547
This commit is contained in:
Jason Merrill 2018-03-14 23:08:24 -04:00 committed by Jason Merrill
parent e786e485a7
commit b149eb04c8
4 changed files with 43 additions and 3 deletions

View File

@ -1,3 +1,9 @@
2018-03-14 Jason Merrill <jason@redhat.com>
PR c++/81236 - auto variable and auto function
* pt.c (tsubst_baselink): Update the type of the BASELINK after
mark_used.
2018-03-14 Jason Merrill <jason@redhat.com>
PR c++/83916 - ICE with template template parameters.

View File

@ -14700,9 +14700,16 @@ tsubst_baselink (tree baselink, tree object_type,
/* If lookup found a single function, mark it as used at this point.
(If lookup found multiple functions the one selected later by
overload resolution will be marked as used at that point.) */
if (!template_id_p && !really_overloaded_fn (fns)
&& !mark_used (OVL_FIRST (fns), complain) && !(complain & tf_error))
return error_mark_node;
if (!template_id_p && !really_overloaded_fn (fns))
{
tree fn = OVL_FIRST (fns);
bool ok = mark_used (fn, complain);
if (!ok && !(complain & tf_error))
return error_mark_node;
if (ok && BASELINK_P (baselink))
/* We might have instantiated an auto function. */
TREE_TYPE (baselink) = TREE_TYPE (fn);
}
if (BASELINK_P (baselink))
{

View File

@ -0,0 +1,15 @@
// { dg-do compile { target c++14 } }
template <class T> struct A
{
static auto fn() { }
static void f()
{
auto x = fn;
}
};
int main()
{
A<int>::f();
}

View File

@ -0,0 +1,12 @@
// CWG issue 2335
// { dg-do compile { target c++14 } }
template <class... Ts> struct partition_indices {
static auto compute_right () {}
static constexpr auto right = compute_right;
};
auto foo () -> partition_indices<>;
void f() {
auto x = foo();
auto y = x.right;
}