From cc804e5114f42fe86de5e1cd453f4c6328a2aa7f Mon Sep 17 00:00:00 2001 From: Mark Mitchell Date: Sun, 25 Oct 1998 23:15:00 +0000 Subject: [PATCH] decl.c (grokdeclarator): Set DECL_NONCONVERTING_P for all non-converting constructors. * decl.c (grokdeclarator): Set DECL_NONCONVERTING_P for all non-converting constructors. From-SVN: r23325 --- gcc/cp/ChangeLog | 5 +++++ gcc/cp/decl.c | 29 +++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 8bd7c7bbd66..69287e3c6fa 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +1998-10-25 Mark Mitchell + + * decl.c (grokdeclarator): Set DECL_NONCONVERTING_P for all + non-converting constructors. + 1998-10-24 Martin von Löwis * gxxint.texi: Correct documentation for n, N, Q, and B. diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 448290bc707..5769a8871f3 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -10508,8 +10508,37 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist) decl = build_decl_attribute_variant (decl, decl_machine_attr); #endif + /* [class.conv.ctor] + + A constructor declared without the function-specifier + explicit that can be called with a single parameter + specifies a conversion from the type of its first + parameter to the type of its class. Such a constructor + is called a converting constructor. */ if (explicitp == 2) DECL_NONCONVERTING_P (decl) = 1; + else if (DECL_CONSTRUCTOR_P (decl)) + { + /* The constructor can be called with exactly one + parameter if there is at least one parameter, and + any subsequent parameters have default arguments. + We don't look at the first parameter, which is + really just the `this' parameter for the new + object. */ + tree arg_types = + TREE_CHAIN (TYPE_ARG_TYPES (TREE_TYPE (decl))); + + /* Skip the `in_chrg' argument too, if present. */ + if (TYPE_USES_VIRTUAL_BASECLASSES (DECL_CONTEXT (decl))) + arg_types = TREE_CHAIN (arg_types); + + if (arg_types == void_list_node + || (arg_types + && TREE_CHAIN (arg_types) + && TREE_CHAIN (arg_types) != void_list_node + && !TREE_PURPOSE (TREE_CHAIN (arg_types)))) + DECL_NONCONVERTING_P (decl) = 1; + } } else if (TREE_CODE (type) == METHOD_TYPE) { -- 2.30.2