re PR c++/17431 (Internal error: Segmentation fault (program cc1plus))
authorNathan Sidwell <nathan@codesourcery.com>
Wed, 1 Dec 2004 10:16:50 +0000 (10:16 +0000)
committerNathan Sidwell <nathan@gcc.gnu.org>
Wed, 1 Dec 2004 10:16:50 +0000 (10:16 +0000)
cp:
PR c++/17431
* call.c (standard_conversion): Add FLAGS parameter. Do not allow
derived to base conversion when checking constructor
accessibility.
(implicit_conversion): Pass FLAGS to standard_conversion.
(check_constructir_callable): Disallow conversion functions.
testsuite:
PR c++/17431
* g++.dg/overload/arg1.C: New.
* g++.dg/overload/arg2.C: New.
* g++.dg/overload/arg3.C: New.
* g++.dg/overload/arg4.C: New.

From-SVN: r91559

gcc/cp/ChangeLog
gcc/cp/call.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/overload/arg1.C [new file with mode: 0644]
gcc/testsuite/g++.dg/overload/arg2.C [new file with mode: 0644]
gcc/testsuite/g++.dg/overload/arg3.C [new file with mode: 0644]
gcc/testsuite/g++.dg/overload/arg4.C [new file with mode: 0644]

index 7f65a2ddde8bb53b7b780df4c469f2559b0492f9..81d1dc80212d288a93e56fdd53084116763f9fdf 100644 (file)
@@ -1,3 +1,12 @@
+2004-12-01  Nathan Sidwell  <nathan@codesourcery.com>
+
+       PR c++/17431
+       * call.c (standard_conversion): Add FLAGS parameter. Do not allow
+       derived to base conversion when checking constructor
+       accessibility.
+       (implicit_conversion): Pass FLAGS to standard_conversion.
+       (check_constructir_callable): Disallow conversion functions.
+
 2004-11-30  Kazu Hirata  <kazu@cs.umass.edu>
 
        * parser.c: Fix comment typos.
index c67b16f2537ba91f10d9c378219e36b350cf229d..f8af887a323b30d2ba88c29a9e244e7584631842 100644 (file)
@@ -170,7 +170,7 @@ static struct z_candidate *add_conv_candidate
 static struct z_candidate *add_function_candidate 
        (struct z_candidate **, tree, tree, tree, tree, tree, int);
 static conversion *implicit_conversion (tree, tree, tree, int);
-static conversion *standard_conversion (tree, tree, tree);
+static conversion *standard_conversion (tree, tree, tree, int);
 static conversion *reference_binding (tree, tree, tree, int);
 static conversion *build_conv (conversion_kind, tree, conversion *);
 static bool is_subseq (conversion *, conversion *);
@@ -583,7 +583,7 @@ strip_top_quals (tree t)
    also pass the expression EXPR to convert from.  */
 
 static conversion *
-standard_conversion (tree to, tree from, tree expr)
+standard_conversion (tree to, tree from, tree expr, int flags)
 {
   enum tree_code fcode, tcode;
   conversion *conv;
@@ -633,7 +633,7 @@ standard_conversion (tree to, tree from, tree expr)
          the standard conversion sequence to perform componentwise
          conversion.  */
       conversion *part_conv = standard_conversion
-        (TREE_TYPE (to), TREE_TYPE (from), NULL_TREE);
+        (TREE_TYPE (to), TREE_TYPE (from), NULL_TREE, flags);
       
       if (part_conv)
         {
@@ -815,7 +815,8 @@ standard_conversion (tree to, tree from, tree expr)
   else if (fcode == VECTOR_TYPE && tcode == VECTOR_TYPE
           && vector_types_convertible_p (from, to))
     return build_conv (ck_std, to, conv);
-  else if (IS_AGGR_TYPE (to) && IS_AGGR_TYPE (from)
+  else if (!(flags & LOOKUP_CONSTRUCTOR_CALLABLE)
+          && IS_AGGR_TYPE (to) && IS_AGGR_TYPE (from)
           && is_properly_derived_from (from, to))
     {
       if (conv->kind == ck_rvalue)
@@ -1227,7 +1228,7 @@ implicit_conversion (tree to, tree from, tree expr, int flags)
   if (TREE_CODE (to) == REFERENCE_TYPE)
     conv = reference_binding (to, from, expr, flags);
   else
-    conv = standard_conversion (to, from, expr);
+    conv = standard_conversion (to, from, expr, flags);
 
   if (conv)
     return conv;
@@ -4081,6 +4082,7 @@ check_constructor_callable (tree type, tree expr)
                             build_tree_list (NULL_TREE, expr), 
                             type,
                             LOOKUP_NORMAL | LOOKUP_ONLYCONVERTING
+                            | LOOKUP_NO_CONVERSION
                             | LOOKUP_CONSTRUCTOR_CALLABLE);
 }
 
index b7e8880e1a9c7355e8fc46d253d6058db148ec11..e9609959c188add80550ccdc6c0cbd0f5a772967 100644 (file)
@@ -1,3 +1,11 @@
+2004-12-01  Nathan Sidwell  <nathan@codesourcery.com>
+
+       PR c++/17431
+       * g++.dg/overload/arg1.C: New.
+       * g++.dg/overload/arg2.C: New.
+       * g++.dg/overload/arg3.C: New.
+       * g++.dg/overload/arg4.C: New.
+
 2004-12-01  Joseph S. Myers  <joseph@codesourcery.com>
 
        * gcc.dg/c99-flex-array-4.c: Remove.
diff --git a/gcc/testsuite/g++.dg/overload/arg1.C b/gcc/testsuite/g++.dg/overload/arg1.C
new file mode 100644 (file)
index 0000000..6ac6a7e
--- /dev/null
@@ -0,0 +1,23 @@
+// { dg-do compile }
+
+// Copyright (C) 2004 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 30 Nov 2004 <nathan@codesourcery.com>
+
+// PR 17431. copy ctor from user conv
+// Origin: Volker Reichelt <reichelt@gcc.gnu.org>
+
+struct A {};
+
+struct B : A
+{
+  B(int); // { dg-error "" "" }
+  B(B &); // { dg-error "" "" }
+  B(A); // { dg-error "" "" }
+};
+
+void foo(B);
+
+void bar()
+{
+  foo(0); // { dg-error "no matching function|initializing" "" }
+}
diff --git a/gcc/testsuite/g++.dg/overload/arg2.C b/gcc/testsuite/g++.dg/overload/arg2.C
new file mode 100644 (file)
index 0000000..1e39186
--- /dev/null
@@ -0,0 +1,22 @@
+// { dg-do compile }
+
+// Copyright (C) 2004 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 30 Nov 2004 <nathan@codesourcery.com>
+
+// PR 17431. copy ctor from user conv
+// Origin: Volker Reichelt <reichelt@gcc.gnu.org>
+
+struct A {};
+
+struct B : A
+{
+  B(int);
+  B(A);
+};
+
+void foo(B);
+
+void bar()
+{
+  foo(0);
+}
diff --git a/gcc/testsuite/g++.dg/overload/arg3.C b/gcc/testsuite/g++.dg/overload/arg3.C
new file mode 100644 (file)
index 0000000..1778ce5
--- /dev/null
@@ -0,0 +1,22 @@
+// { dg-do compile }
+
+// Copyright (C) 2004 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 30 Nov 2004 <nathan@codesourcery.com>
+
+// PR 17431. copy ctor from user conv
+// Origin: Volker Reichelt <reichelt@gcc.gnu.org>
+
+struct A {};
+
+struct B : A
+{
+  B(int); // { dg-error "" "" }
+  B(B&);  // { dg-error "" "" }
+};
+
+void foo(B);
+
+void bar()
+{
+  foo(0); // { dg-error "no matching function|initializing" "" }
+}
diff --git a/gcc/testsuite/g++.dg/overload/arg4.C b/gcc/testsuite/g++.dg/overload/arg4.C
new file mode 100644 (file)
index 0000000..34aa625
--- /dev/null
@@ -0,0 +1,30 @@
+// { dg-do compile }
+
+// Copyright (C) 2004 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 30 Nov 2004 <nathan@codesourcery.com>
+
+// PR 17431. copy ctor from user conv
+// Origin: Volker Reichelt <reichelt@gcc.gnu.org>
+
+struct A {};
+
+struct B : A
+{
+  B(int);  // { dg-error "" "" }
+  B(B&);   // { dg-error "" "" }
+  B(A);    // { dg-error "" "" }
+};
+
+struct C
+{
+  operator B () const;  
+};
+
+
+void foo(B);
+
+void bar()
+{
+  C c;
+  foo(c); // { dg-error "no matching function|initializing" "" }
+}