Hi,
On 04/28/2013 09:10 PM, Jason Merrill wrote:
On 04/27/2013 05:17 PM, Paolo Carlini wrote:
Assuming as obvious that we don't want to crash on it, the interesting
issue is whether we want the static_asserts to both fail or succeed: in
practice, a rather recent ICC I have at hand fails both; a rather recent
clang++ passes both (consistently with the expectation of Bug
submitter). In fact, as I'm reading now 7.1.6.2/4, since we are dealing
with a class member access in any case, it may well be possible that
*ICC* is right.
Yes, I think so. Since it's a class member access, decltype should be
the declared type, i.e. const int.
Thanks. Is the below Ok, then? Tested (again) on x86_64-linux.
Thanks,
Paolo.
//////////////////////////
/cp
2013-04-28 Paolo Carlini <paolo.carl...@oracle.com>
PR c++/56450
* semantics.c (finish_decltype_type): Handle COMPOUND_EXPR.
/testsuite
2013-04-28 Paolo Carlini <paolo.carl...@oracle.com>
PR c++/56450
* testsuite/g++.dg/cpp0x/decltype52.C: New.
Index: cp/semantics.c
===================================================================
--- cp/semantics.c (revision 198366)
+++ cp/semantics.c (working copy)
@@ -5398,6 +5398,7 @@ finish_decltype_type (tree expr, bool id_expressio
break;
case COMPONENT_REF:
+ case COMPOUND_EXPR:
mark_type_use (expr);
type = is_bitfield_expr_with_lowered_type (expr);
if (!type)
Index: testsuite/g++.dg/cpp0x/decltype52.C
===================================================================
--- testsuite/g++.dg/cpp0x/decltype52.C (revision 0)
+++ testsuite/g++.dg/cpp0x/decltype52.C (working copy)
@@ -0,0 +1,18 @@
+// PR c++/56450
+// { dg-do compile { target c++11 } }
+
+template<typename T>
+T&& declval();
+
+template<typename, typename>
+struct is_same
+{ static constexpr bool value = false; };
+
+template<typename T>
+struct is_same<T, T>
+{ static constexpr bool value = true; };
+
+struct A { static const int dummy = 0; };
+
+static_assert(is_same<decltype(declval<A>().dummy), const int>::value, "");
+static_assert(!is_same<decltype(declval<A>().dummy), const int&>::value, "");