aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorNathan Sidwell <nathan@codesourcery.com>2004-12-01 10:16:50 +0000
committerNathan Sidwell <nathan@gcc.gnu.org>2004-12-01 10:16:50 +0000
commit386489e361a1299e34dd6f755dad1f4023ce08e3 (patch)
treefd2f0d33bb80e63ed673425f60340bd87354c1ef /gcc
parenteab97e449ba769f0a8f4cf5cd69970bbf38de38f (diff)
downloadgcc-386489e361a1299e34dd6f755dad1f4023ce08e3.zip
gcc-386489e361a1299e34dd6f755dad1f4023ce08e3.tar.gz
gcc-386489e361a1299e34dd6f755dad1f4023ce08e3.tar.bz2
re PR c++/17431 (Internal error: Segmentation fault (program cc1plus))
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog9
-rw-r--r--gcc/cp/call.c12
-rw-r--r--gcc/testsuite/ChangeLog8
-rw-r--r--gcc/testsuite/g++.dg/overload/arg1.C23
-rw-r--r--gcc/testsuite/g++.dg/overload/arg2.C22
-rw-r--r--gcc/testsuite/g++.dg/overload/arg3.C22
-rw-r--r--gcc/testsuite/g++.dg/overload/arg4.C30
7 files changed, 121 insertions, 5 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 7f65a2d..81d1dc8 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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.
diff --git a/gcc/cp/call.c b/gcc/cp/call.c
index c67b16f..f8af887 100644
--- a/gcc/cp/call.c
+++ b/gcc/cp/call.c
@@ -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);
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index b7e8880..e960995 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..6ac6a7e
--- /dev/null
+++ b/gcc/testsuite/g++.dg/overload/arg1.C
@@ -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
index 0000000..1e39186
--- /dev/null
+++ b/gcc/testsuite/g++.dg/overload/arg2.C
@@ -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
index 0000000..1778ce5
--- /dev/null
+++ b/gcc/testsuite/g++.dg/overload/arg3.C
@@ -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
index 0000000..34aa625
--- /dev/null
+++ b/gcc/testsuite/g++.dg/overload/arg4.C
@@ -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" "" }
+}