@@ -25800,6 +25800,14 @@ instantiation_dependent_r (tree *tp, int *walk_subtrees,
return *tp;
break;
+ case CONSTRUCTOR:
+ /* A compound literal with a value-dependent expression
+ might contain narrowing conversion. */
+ if (TREE_HAS_CONSTRUCTOR (*tp)
+ && value_dependent_expression_p (*tp))
+ return *tp;
+ break;
+
default:
break;
}
new file mode 100644
@@ -0,0 +1,25 @@
+// PR c++/88815
+// { dg-do compile { target c++11 } }
+
+struct true_type {
+ constexpr operator bool() const { return true; }
+};
+
+struct false_type {
+ constexpr operator bool() const { return false; }
+};
+
+template<int (*p)()>
+true_type is_constexpr_impl(decltype(int{(p(), 0U)}));
+
+template<int (*p)()>
+false_type is_constexpr_impl(...);
+
+template<int (*p)()>
+using is_constexpr = decltype(is_constexpr_impl<p>(0));
+
+constexpr int f() { return 0; }
+int g() { return 0; }
+
+static_assert(is_constexpr<f>(), "");
+static_assert(!is_constexpr<g>(), "");