diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc index c350ebb0a799cef9eaab3219ff6e8bd42474167e..d47483dd4f207bc2d75e90dc33ef78a196b85c52 100644 --- a/gcc/cp/pt.cc +++ b/gcc/cp/pt.cc @@ -7316,7 +7316,7 @@ convert_nontype_argument (tree type, tree expr, tsubst_flags_t complain) if (non_dep) expr = instantiate_non_dependent_expr_internal (expr, complain); - const bool val_dep_p = value_dependent_expression_p (expr); + bool val_dep_p = value_dependent_expression_p (expr); if (val_dep_p) expr = canonicalize_expr_argument (expr, complain); else @@ -7357,6 +7357,8 @@ convert_nontype_argument (tree type, tree expr, tsubst_flags_t complain) expr = maybe_constant_value (expr, NULL_TREE, /*manifestly_const_eval=*/true); expr = convert_from_reference (expr); + /* EXPR may have become value-dependent. */ + val_dep_p = value_dependent_expression_p (expr); } else if (TYPE_PTR_OR_PTRMEM_P (type)) { diff --git a/gcc/testsuite/g++.dg/cpp0x/alias-decl-74.C b/gcc/testsuite/g++.dg/cpp0x/alias-decl-74.C new file mode 100644 index 0000000000000000000000000000000000000000..8382d8563827a4eb73155bb452362d9a28a03fdc --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/alias-decl-74.C @@ -0,0 +1,9 @@ +// PR c++/104108 +// { dg-do compile { target c++11 } } + +template<template<const int&> class T> +struct S { + static int m_parameter; + template<template<const int&> class TT> + using U = TT<m_parameter>; +};