diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc index f056a4f38e64dcfcb2773d961bc81416a101ac5d..adaaa8f89a69dcb0f6bdad0e696e1e9d4977c080 100644 --- a/gcc/cp/pt.cc +++ b/gcc/cp/pt.cc @@ -27972,9 +27972,7 @@ value_dependent_expression_p (tree expression) case VAR_DECL: /* A constant with literal type and is initialized with an expression that is value-dependent. */ - if (DECL_DEPENDENT_INIT_P (expression) - /* FIXME cp_finish_decl doesn't fold reference initializers. */ - || TYPE_REF_P (TREE_TYPE (expression))) + if (DECL_DEPENDENT_INIT_P (expression)) return true; if (DECL_HAS_VALUE_EXPR_P (expression)) { @@ -27989,6 +27987,9 @@ value_dependent_expression_p (tree expression) && value_expr == error_mark_node)) return true; } + else if (TYPE_REF_P (TREE_TYPE (expression))) + /* FIXME cp_finish_decl doesn't fold reference initializers. */ + return true; /* We have a constexpr variable and we're processing a template. When there's lifetime extension involved (for which finish_compound_literal used to create a temporary), we'll not be able to evaluate the diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-const11a.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-const11a.C new file mode 100644 index 0000000000000000000000000000000000000000..7fc3d48a8ddbddd3104d6e25e4de9e0bbb596957 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-const11a.C @@ -0,0 +1,21 @@ +// PR c++/108975 +// A version of lambda-const11.C using a generic lambda. +// { dg-do compile { target c++14 } } + +template<int> void g(); +template<int> struct A { }; + +template<class T> +void f() { + constexpr int dim = 1; + auto l = [&](auto) { + int n[dim * 1]; + using ty1 = decltype(g<dim * 2>()); + using ty2 = A<dim * 3>; + }; + l(0); + // In f<int>, we shouldn't actually capture dim. + static_assert (sizeof(l) == 1, ""); +} + +template void f<int>();