PR c++/81525 - wrong constant value with generic lambda
* pt.c (tsubst_decl) [VAR_DECL]: Avoid clobbering auto. (tsubst_copy) [VAR_DECL]: Handle auto. From-SVN: r251001
This commit is contained in:
parent
abe0604c18
commit
c02c8b11e1
@ -1,3 +1,9 @@
|
||||
2017-08-09 Jason Merrill <jason@redhat.com>
|
||||
|
||||
PR c++/81525 - wrong constant value with generic lambda
|
||||
* pt.c (tsubst_decl) [VAR_DECL]: Avoid clobbering auto.
|
||||
(tsubst_copy) [VAR_DECL]: Handle auto.
|
||||
|
||||
2017-08-09 Leonid Koppel <lkoppel@uwaterloo.ca>
|
||||
|
||||
PR c++/67054 - Inherited ctor with non-default-constructible members
|
||||
|
12
gcc/cp/pt.c
12
gcc/cp/pt.c
@ -12896,7 +12896,15 @@ tsubst_decl (tree t, tree args, tsubst_flags_t complain)
|
||||
&& VAR_HAD_UNKNOWN_BOUND (t)
|
||||
&& type != error_mark_node)
|
||||
type = strip_array_domain (type);
|
||||
tree auto_node = type_uses_auto (type);
|
||||
int len = TREE_VEC_LENGTH (args);
|
||||
if (auto_node)
|
||||
/* Mask off any template args past the variable's context so we
|
||||
don't replace the auto with an unrelated argument. */
|
||||
TREE_VEC_LENGTH (args) = TEMPLATE_TYPE_LEVEL (auto_node) - 1;
|
||||
type = tsubst (type, args, complain, in_decl);
|
||||
if (auto_node)
|
||||
TREE_VEC_LENGTH (args) = len;
|
||||
}
|
||||
if (VAR_P (r))
|
||||
{
|
||||
@ -14687,6 +14695,10 @@ tsubst_copy (tree t, tree args, tsubst_flags_t complain, tree in_decl)
|
||||
DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (r)
|
||||
= TREE_CONSTANT (r) = true;
|
||||
DECL_INITIAL (r) = init;
|
||||
if (tree auto_node = type_uses_auto (TREE_TYPE (r)))
|
||||
TREE_TYPE (r)
|
||||
= do_auto_deduction (TREE_TYPE (r), init, auto_node,
|
||||
complain, adc_variable_type);
|
||||
}
|
||||
gcc_assert (cp_unevaluated_operand || TREE_STATIC (r)
|
||||
|| decl_constant_var_p (r)
|
||||
|
20
gcc/testsuite/g++.dg/cpp1y/lambda-generic-const4.C
Normal file
20
gcc/testsuite/g++.dg/cpp1y/lambda-generic-const4.C
Normal file
@ -0,0 +1,20 @@
|
||||
// PR c++/81525
|
||||
// { dg-do compile { target c++14 } }
|
||||
|
||||
template <int i> struct A {
|
||||
constexpr operator int () const { return i; }
|
||||
};
|
||||
template <int i> constexpr A<i> a = {};
|
||||
|
||||
template <typename F> void foo (F f) {
|
||||
f (A<0>{});
|
||||
}
|
||||
template <typename T>
|
||||
void bar (T) {
|
||||
constexpr auto N = a<1>;
|
||||
auto f = [&] (auto i) {
|
||||
static_assert (static_cast<int>(N) == 1, "");
|
||||
};
|
||||
foo (f);
|
||||
}
|
||||
int main () { bar (0); }
|
Loading…
Reference in New Issue
Block a user