Commit 97973457 by Jason Merrill Committed by Jason Merrill

re PR c++/67041 ([C++14] Variable template initialized by call to lambda does not compile)

	PR c++/67041
	* pt.c (tsubst_copy_and_build): Handle variables like functions.

From-SVN: r227553
parent 51aae43f
2015-09-08 Jason Merrill <jason@redhat.com>
PR c++/67041
* pt.c (tsubst_copy_and_build): Handle variables like functions.
2015-09-08 Paolo Carlini <paolo.carlini@oracle.com> 2015-09-08 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/67369 PR c++/67369
......
...@@ -16321,15 +16321,14 @@ tsubst_copy_and_build (tree t, ...@@ -16321,15 +16321,14 @@ tsubst_copy_and_build (tree t,
LAMBDA_EXPR_MUTABLE_P (r) = LAMBDA_EXPR_MUTABLE_P (t); LAMBDA_EXPR_MUTABLE_P (r) = LAMBDA_EXPR_MUTABLE_P (t);
LAMBDA_EXPR_DISCRIMINATOR (r) LAMBDA_EXPR_DISCRIMINATOR (r)
= (LAMBDA_EXPR_DISCRIMINATOR (t)); = (LAMBDA_EXPR_DISCRIMINATOR (t));
/* For a function scope, we want to use tsubst so that we don't
complain about referring to an auto function before its return
type has been deduced. Otherwise, we want to use tsubst_copy so
that we look up the existing field/parameter/variable rather
than build a new one. */
tree scope = LAMBDA_EXPR_EXTRA_SCOPE (t); tree scope = LAMBDA_EXPR_EXTRA_SCOPE (t);
if (scope && TREE_CODE (scope) == FUNCTION_DECL) if (!scope)
/* No substitution needed. */;
else if (VAR_OR_FUNCTION_DECL_P (scope))
/* For a function or variable scope, we want to use tsubst so that we
don't complain about referring to an auto before deduction. */
scope = tsubst (scope, args, complain, in_decl); scope = tsubst (scope, args, complain, in_decl);
else if (scope && TREE_CODE (scope) == PARM_DECL) else if (TREE_CODE (scope) == PARM_DECL)
{ {
/* Look up the parameter we want directly, as tsubst_copy /* Look up the parameter we want directly, as tsubst_copy
doesn't do what we need. */ doesn't do what we need. */
...@@ -16342,8 +16341,12 @@ tsubst_copy_and_build (tree t, ...@@ -16342,8 +16341,12 @@ tsubst_copy_and_build (tree t,
if (DECL_CONTEXT (scope) == NULL_TREE) if (DECL_CONTEXT (scope) == NULL_TREE)
DECL_CONTEXT (scope) = fn; DECL_CONTEXT (scope) = fn;
} }
else else if (TREE_CODE (scope) == FIELD_DECL)
/* For a field, use tsubst_copy so that we look up the existing field
rather than build a new one. */
scope = RECUR (scope); scope = RECUR (scope);
else
gcc_unreachable ();
LAMBDA_EXPR_EXTRA_SCOPE (r) = scope; LAMBDA_EXPR_EXTRA_SCOPE (r) = scope;
LAMBDA_EXPR_RETURN_TYPE (r) LAMBDA_EXPR_RETURN_TYPE (r)
= tsubst (LAMBDA_EXPR_RETURN_TYPE (t), args, complain, in_decl); = tsubst (LAMBDA_EXPR_RETURN_TYPE (t), args, complain, in_decl);
......
// PR c++/67041
// { dg-do compile { target c++14 } }
template<typename T>
auto test = [](){
return T{};
};
int main() {
test<int>();
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment