@@ -6749,7 +6749,11 @@ convert_nontype_argument (tree type, tree expr, tsubst_flags_t complain)
}
}
- if (!value_dependent_expression_p (expr))
+ if (TREE_CODE (TREE_TYPE (expr)) == REFERENCE_TYPE
+ && value_dependent_expression_p (expr))
+ /* OK, dependent reference. We don't want to ask whether a DECL is
+ itself value-dependent, since what we want here is its address. */;
+ else
{
if (!DECL_P (expr))
{
@@ -6771,8 +6775,11 @@ convert_nontype_argument (tree type, tree expr, tsubst_flags_t complain)
return NULL_TREE;
}
- expr = build_nop (type, build_address (expr));
+ expr = build_address (expr);
}
+
+ if (!same_type_p (type, TREE_TYPE (expr)))
+ expr = build_nop (type, expr);
}
/* [temp.arg.nontype]/5, bullet 4
new file mode 100644
@@ -0,0 +1,13 @@
+// PR c++/80840
+// { dg-do compile { target c++11 } }
+
+template <class T, T X>
+struct Just;
+
+template <const double& X>
+struct Number {
+ static constexpr double value = X;
+ using result = Just<const double&, value>;
+};
+
+int main() {}