From: Mark Mitchell Date: Mon, 9 Nov 1998 09:32:06 +0000 (+0000) Subject: decl.c (grokdeclarator): Tighten checks for invalid destructors. X-Git-Tag: prereleases/egcs-1.1.1-prerelease-2~7 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=31a053c85f8fef499a68c9a3ec1f9c51ca3acf6b;p=thirdparty%2Fgcc.git decl.c (grokdeclarator): Tighten checks for invalid destructors. * decl.c (grokdeclarator): Tighten checks for invalid destructors. Improve error-messages and error-recovery. * decl2.c (check_classfn): Don't assume that mangled destructor names contain type information. ---------------------------------------------------------------------- From-SVN: r23583 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 9c3e7284269b..bc24d5ce6e08 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +1998-11-08 Mark Mitchell + + * decl.c (grokdeclarator): Tighten checks for invalid + destructors. Improve error-messages and error-recovery. + * decl2.c (check_classfn): Don't assume that mangled destructor + names contain type information. + 1998-11-02 Jason Merrill * decl2.c (import_export_decl): Call import_export_class. diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 92b19dc87b20..68f62ae5dcc7 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -9425,8 +9425,9 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist) error ("destructor cannot be static member function"); if (quals) { - error ("destructors cannot be declared `const' or `volatile'"); - return void_type_node; + cp_error ("destructors may not be `%s'", + IDENTIFIER_POINTER (TREE_VALUE (quals))); + quals = NULL_TREE; } if (decl_context == FIELD) { @@ -9451,8 +9452,9 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist) } if (quals) { - error ("constructors cannot be declared `const' or `volatile'"); - return void_type_node; + cp_error ("constructors may not be `%s'", + IDENTIFIER_POINTER (TREE_VALUE (quals))); + quals = NULL_TREE; } { RID_BIT_TYPE tmp_bits; @@ -9510,24 +9512,22 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist) arg_types = grokparms (inner_parms, funcdecl_p ? funcdef_flag : 0); - if (declarator) + if (declarator && flags == DTOR_FLAG) { - /* Get past destructors, etc. - We know we have one because FLAGS will be non-zero. - - Complain about improper parameter lists here. */ + /* A destructor declared in the body of a class will + be represented as a BIT_NOT_EXPR. But, we just + want the underlying IDENTIFIER. */ if (TREE_CODE (declarator) == BIT_NOT_EXPR) + declarator = TREE_OPERAND (declarator, 0); + + if (strict_prototype == 0 && arg_types == NULL_TREE) + arg_types = void_list_node; + else if (arg_types == NULL_TREE + || arg_types != void_list_node) { - declarator = TREE_OPERAND (declarator, 0); - - if (strict_prototype == 0 && arg_types == NULL_TREE) - arg_types = void_list_node; - else if (arg_types == NULL_TREE - || arg_types != void_list_node) - { - error ("destructors cannot be specified with parameters"); - arg_types = void_list_node; - } + cp_error ("destructors may not have parameters"); + arg_types = void_list_node; + last_function_parms = NULL_TREE; } } diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c index baae04b2d401..903da7639904 100644 --- a/gcc/cp/decl2.c +++ b/gcc/cp/decl2.c @@ -1480,9 +1480,12 @@ check_classfn (ctype, function) fndecl = OVL_CURRENT (fndecls); /* The DECL_ASSEMBLER_NAME for a TEMPLATE_DECL is not mangled, so the check below does not work - correctly in that case. */ + correctly in that case. Since mangled destructor names + do not include the type of the arguments, we + can't use this short-cut for them, either. */ if (TREE_CODE (function) != TEMPLATE_DECL && TREE_CODE (fndecl) != TEMPLATE_DECL + && !DESTRUCTOR_NAME_P (DECL_ASSEMBLER_NAME (function)) && (DECL_ASSEMBLER_NAME (function) == DECL_ASSEMBLER_NAME (fndecl))) return fndecl;