re PR c++/47851 ([C++0x] Incorrect decltype result for conditional operator)
authorJason Merrill <jason@redhat.com>
Tue, 1 Mar 2011 22:44:35 +0000 (17:44 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Tue, 1 Mar 2011 22:44:35 +0000 (17:44 -0500)
PR c++/47851
* call.c (standard_conversion): Provide requested cv-quals on
class rvalue conversion.

From-SVN: r170601

gcc/cp/ChangeLog
gcc/cp/call.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp0x/decltype25.C [new file with mode: 0644]

index ac3f4d71f2ea606e7ba8984df99e7882dc5511f2..1a522e7a9797834adffef9890caa445e8eabfc85 100644 (file)
@@ -1,5 +1,9 @@
 2011-03-01  Jason Merrill  <jason@redhat.com>
 
+       PR c++/47851
+       * call.c (standard_conversion): Provide requested cv-quals on
+       class rvalue conversion.
+
        PR c++/46282
        * decl2.c (grokbitfield): Handle type-dependent width.
 
index 8dccbbef4124f5e31b7b5f0c0f782f034743f505..a297f5313e375ac42865fc0ec5413e40a4f62643 100644 (file)
@@ -850,6 +850,7 @@ standard_conversion (tree to, tree from, tree expr, bool c_cast_p,
   enum tree_code fcode, tcode;
   conversion *conv;
   bool fromref = false;
+  tree qualified_to;
 
   to = non_reference (to);
   if (TREE_CODE (from) == REFERENCE_TYPE)
@@ -857,6 +858,7 @@ standard_conversion (tree to, tree from, tree expr, bool c_cast_p,
       fromref = true;
       from = TREE_TYPE (from);
     }
+  qualified_to = to;
   to = strip_top_quals (to);
   from = strip_top_quals (from);
 
@@ -918,7 +920,11 @@ standard_conversion (tree to, tree from, tree expr, bool c_cast_p,
     }
 
   if (same_type_p (from, to))
-    return conv;
+    {
+      if (CLASS_TYPE_P (to) && conv->kind == ck_rvalue)
+       conv->type = qualified_to;
+      return conv;
+    }
 
   /* [conv.ptr]
      A null pointer constant can be converted to a pointer type; ... A
index fed2d43e4d2016b8294daf2e61ffc9893e2f6f8f..55408593ed3215f63acfc178ed0f1146f3b6dcbe 100644 (file)
@@ -1,5 +1,7 @@
 2011-03-01  Jason Merrill  <jason@redhat.com>
 
+       * g++.dg/cpp0x/decltype25.C: New.
+
        * g++.dg/cpp0x/regress/bitfield-err1.C: New.
 
 2011-03-01  Richard Guenther  <rguenther@suse.de>
diff --git a/gcc/testsuite/g++.dg/cpp0x/decltype25.C b/gcc/testsuite/g++.dg/cpp0x/decltype25.C
new file mode 100644 (file)
index 0000000..c9559f1
--- /dev/null
@@ -0,0 +1,20 @@
+// PR c++/47851
+// { dg-options -std=c++0x }
+
+struct Type {
+  void display_type();
+  void display_type() const { }
+};
+
+typedef Type const ConstType;
+
+struct ConvertibleToType {
+    operator Type&() { return *reinterpret_cast<Type*>(this); }
+};
+
+int main ()
+{
+  // Both lines should call the const variant.
+  (true ? ConvertibleToType() : ConstType()).display_type();
+  decltype((true ? ConvertibleToType() : ConstType()))().display_type();
+}