]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR c++/26698 (g++ accepts const-incorrect code due to conversion function)
authorSimon Martin <simartin@users.sourceforge.net>
Fri, 12 Oct 2007 18:43:33 +0000 (18:43 +0000)
committerSimon Martin <simartin@gcc.gnu.org>
Fri, 12 Oct 2007 18:43:33 +0000 (18:43 +0000)
gcc/cp/

2007-10-12  Simon Martin  <simartin@users.sourceforge.net>

PR c++/26698
* call.c (build_user_type_conversion_1): Do not consider conversion
functions to convert a (possibly cv-qualified) object to the (possibly
cv-qualified) same object type (or a reference to it), to a (possibly
cv-qualified) base class of that type (or a reference to it).

gcc/testsuite/

2007-10-12  Simon Martin  <simartin@users.sourceforge.net>

PR c++/26698
* g++.dg/conversion/op4.C: New test.

From-SVN: r129274

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

index 075e2096dc93ad8055e531d34181baa6327b54e3..bc25402a0e9d50159bed1f29e5dd6fa55848d8f6 100644 (file)
@@ -1,3 +1,11 @@
+2007-10-12  Simon Martin  <simartin@users.sourceforge.net>
+
+       PR c++/26698
+       * call.c (build_user_type_conversion_1): Do not consider conversion
+       functions to convert a (possibly cv-qualified) object to the (possibly
+       cv-qualified) same object type (or a reference to it), to a (possibly
+       cv-qualified) base class of that type (or a reference to it).
+
 2007-10-12  Paolo Carlini  <pcarlini@suse.de>
 
        * pt.c (tsubst): Use template_parm_level_and_index.
index cf3aea7e9594985ef2a3ab7280d675e723c8e1c3..6ca0a957f425f61e50ced3947f3f8be524627cf9 100644 (file)
@@ -2601,7 +2601,21 @@ build_user_type_conversion_1 (tree totype, tree expr, int flags)
     ctors = lookup_fnfields (totype, complete_ctor_identifier, 0);
 
   if (IS_AGGR_TYPE (fromtype))
-    conv_fns = lookup_conversions (fromtype);
+    {
+      tree to_nonref = non_reference (totype);
+      if (same_type_ignoring_top_level_qualifiers_p (to_nonref, fromtype) ||
+         (CLASS_TYPE_P (to_nonref) && CLASS_TYPE_P (fromtype)
+          && DERIVED_FROM_P (to_nonref, fromtype)))
+       {
+         /* [class.conv.fct] A conversion function is never used to
+            convert a (possibly cv-qualified) object to the (possibly
+            cv-qualified) same object type (or a reference to it), to a
+            (possibly cv-qualified) base class of that type (or a
+            reference to it)...  */
+       }
+      else
+       conv_fns = lookup_conversions (fromtype);
+    }
 
   candidates = 0;
   flags |= LOOKUP_NO_CONVERSION;
index 0b3aa07d3ac11ec9590ea3c88b1197256634644a..6b0c2f82c34e485d3d07ad3fd342f7c9f3ba06fd 100644 (file)
@@ -1,3 +1,8 @@
+2007-10-12  Simon Martin  <simartin@users.sourceforge.net>
+
+       PR c++/26698
+       * g++.dg/conversion/op4.C: New test.
+
 2007-10-12  Richard Sandiford  <rsandifo@nildram.co.uk>
 
        * g++.dg/torture/pr33572.C (main): Allow argc to be zero.
diff --git a/gcc/testsuite/g++.dg/conversion/op4.C b/gcc/testsuite/g++.dg/conversion/op4.C
new file mode 100644 (file)
index 0000000..164bbcd
--- /dev/null
@@ -0,0 +1,19 @@
+/* PR c++/26698 */
+/* { dg-do "compile" } */
+
+struct X {
+  int x;
+  X (int i = 0) : x (i) {}
+  operator X& (void) const {
+    return *(new X);
+  }
+};
+
+void add_one (X & ref) { /* { dg-error "in passing argument" } */
+  ++ ref.x;
+}
+
+void foo() {
+  X const a (2);
+  add_one(a); /* { dg-error "invalid initialization of reference of type" } */
+}