]> 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>
Sat, 13 Oct 2007 06:04:57 +0000 (06:04 +0000)
committerSimon Martin <simartin@gcc.gnu.org>
Sat, 13 Oct 2007 06:04:57 +0000 (06:04 +0000)
gcc/cp/

2007-10-13  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-13  Simon Martin  <simartin@users.sourceforge.net>

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

From-SVN: r129282

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

index 5a8ecbcbe35be93e072dd94708992b4fa25a97b7..e884dc47c69b6ba8c05b93098b58607317556cf7 100644 (file)
@@ -1,3 +1,11 @@
+2007-10-13  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-09  Jason Merrill  <jason@redhat.com>
 
        PR c++/32470
index 891ebb96829c4f9a6867ae3520914623523b9a08..244cab1c1f341a680f7ae1ca65c8eceafb788476 100644 (file)
@@ -2550,7 +2550,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 7ffdf38aec723596b978620ab9f87b5993071912..6de4856501f7c05d129b70c62972f003e8742365 100644 (file)
@@ -1,3 +1,8 @@
+2007-10-13  Simon Martin  <simartin@users.sourceforge.net>
+
+       PR c++/26698
+       * g++.dg/conversion/op4.C: New test.
+
 2007-10-12  Zdenek Dvorak <ook@ucw.cz>
 
        PR tree-optimization/33714
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" } */
+}