This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

C++ PATCH: Fix PR112



This patch fixes PR112, a regression from GCC 2.95.

We shouldn't allow people to take the `typeid' of a variable-sized
type; the semantics of that are not even close to being well-defined.
While I was at it, I removed a few more remnants of the old mangling
scheme.

Tested on i686-pc-linux-gnu, installed on the mainline and the branch.

--
Mark Mitchell                   mark@codesourcery.com
CodeSourcery, LLC               http://www.codesourcery.com

2001-04-03  Mark Mitchell  <mark@codesourcery.com>

	* cp-tree.h (OPERATOR_ASSIGN_FORMAT): Remove.
	(OPERATOR_FORMAT): Likewise.
	(OPERATOR_TYPENAME_FORMAT): Likewise.
	* operators.def: Remove old name-mangling information.
	* decl.c (grok_op_properties): Adjust accordingly.
	* lex.c (init_operators): Likewise.
	* rtti.c (get_tinfo_decl): Issue error messages about types that
	have variable size.

Index: testsuite/g++.old-deja/g++.other/typeid1.C
===================================================================
RCS file: typeid1.C
diff -N typeid1.C
*** /dev/null	Tue May  5 13:32:27 1998
--- typeid1.C	Tue Apr  3 21:12:19 2001
***************
*** 0 ****
--- 1,15 ----
+ // Build don't link:
+ // Origin: sk@gluit.de
+ // Special g++ Options: 
+ 
+ #include <typeinfo>
+ 
+ int main ()
+ {
+   typeid(char*);
+   
+   int len = 1;
+   char carr[len];
+   typeid(typeof(carr)); // ERROR - type has variable size
+   typeid(carr); // ERROR - type has variable size
+ }
Index: cp/cp-tree.h
===================================================================
RCS file: /cvs/gcc/gcc/gcc/cp/cp-tree.h,v
retrieving revision 1.572.2.13
diff -c -p -r1.572.2.13 cp-tree.h
*** cp-tree.h	2001/03/26 10:05:21	1.572.2.13
--- cp-tree.h	2001/04/04 04:12:22
*************** extern varray_type local_classes;
*** 3256,3265 ****
  
  /* Here's where we control how name mangling takes place.  */
  
- #define OPERATOR_ASSIGN_FORMAT "__a%s"
- #define OPERATOR_FORMAT "__%s"
- #define OPERATOR_TYPENAME_FORMAT "__op"
- 
  /* Cannot use '$' up front, because this confuses gdb
     (names beginning with '$' are gdb-local identifiers).
  
--- 3256,3261 ----
Index: cp/decl.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/cp/decl.c,v
retrieving revision 1.747.2.14
diff -c -p -r1.747.2.14 decl.c
*** decl.c	2001/03/27 04:41:17	1.747.2.14
--- decl.c	2001/04/04 04:12:26
*************** grok_op_properties (decl, virtualp, frie
*** 12084,12100 ****
    else
      do
        {
! #define DEF_OPERATOR(NAME, CODE, NEW_MANGLING, OLD_MANGING, ARITY, ASSN_P)  \
! 	if (ansi_opname (CODE) == name)					    \
! 	  {								    \
! 	    operator_code = CODE;					    \
! 	    break;							    \
! 	  }								    \
! 	else if (ansi_assopname (CODE) == name)				    \
! 	  {								    \
! 	    operator_code = CODE;					    \
! 	    DECL_ASSIGNMENT_OPERATOR_P (decl) = 1;			    \
! 	    break;							    \
  	  }
  
  #include "operators.def"
--- 12084,12100 ----
    else
      do
        {
! #define DEF_OPERATOR(NAME, CODE, MANGLING, ARITY, ASSN_P)	\
! 	if (ansi_opname (CODE) == name)				\
! 	  {							\
! 	    operator_code = CODE;				\
! 	    break;						\
! 	  }							\
! 	else if (ansi_assopname (CODE) == name)			\
! 	  {							\
! 	    operator_code = CODE;				\
! 	    DECL_ASSIGNMENT_OPERATOR_P (decl) = 1;		\
! 	    break;						\
  	  }
  
  #include "operators.def"
Index: cp/lex.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/cp/lex.c,v
retrieving revision 1.237.2.1
diff -c -p -r1.237.2.1 lex.c
*** lex.c	2001/03/15 19:29:23	1.237.2.1
--- lex.c	2001/04/04 04:12:26
*************** operator_name_info_t assignment_operator
*** 313,319 ****
  
  /* Initialize data structures that keep track of operator names.  */
  
! #define DEF_OPERATOR(NAME, C, NM, OM, AR, AP) \
   CONSTRAINT (C, sizeof "operator " + sizeof NAME <= 256);
  #include "operators.def"
  #undef DEF_OPERATOR
--- 313,319 ----
  
  /* Initialize data structures that keep track of operator names.  */
  
! #define DEF_OPERATOR(NAME, C, M, AR, AP) \
   CONSTRAINT (C, sizeof "operator " + sizeof NAME <= 256);
  #include "operators.def"
  #undef DEF_OPERATOR
*************** init_operators ()
*** 325,331 ****
    char buffer[256];
    struct operator_name_info_t *oni;
  
! #define DEF_OPERATOR(NAME, CODE, NEW_MANGLING, OLD_MANGLING, ARITY, ASSN_P) \
    sprintf (buffer, ISALPHA (NAME[0]) ? "operator %s" : "operator%s", NAME); \
    identifier = get_identifier (buffer);					    \
    IDENTIFIER_OPNAME_P (identifier) = 1;					    \
--- 325,331 ----
    char buffer[256];
    struct operator_name_info_t *oni;
  
! #define DEF_OPERATOR(NAME, CODE, MANGLING, ARITY, ASSN_P)		    \
    sprintf (buffer, ISALPHA (NAME[0]) ? "operator %s" : "operator%s", NAME); \
    identifier = get_identifier (buffer);					    \
    IDENTIFIER_OPNAME_P (identifier) = 1;					    \
*************** init_operators ()
*** 335,341 ****
  	 : &operator_name_info[(int) CODE]);				    \
    oni->identifier = identifier;						    \
    oni->name = NAME;							    \
!   oni->mangled_name = NEW_MANGLING;
  
  #include "operators.def"
  #undef DEF_OPERATOR
--- 335,341 ----
  	 : &operator_name_info[(int) CODE]);				    \
    oni->identifier = identifier;						    \
    oni->name = NAME;							    \
!   oni->mangled_name = MANGLING;
  
  #include "operators.def"
  #undef DEF_OPERATOR
Index: cp/operators.def
===================================================================
RCS file: /cvs/gcc/gcc/gcc/cp/operators.def,v
retrieving revision 1.6
diff -c -p -r1.6 operators.def
*** operators.def	2000/09/04 03:22:54	1.6
--- operators.def	2001/04/04 04:12:27
***************
*** 5,11 ****
     non-overloadable operators (like the `?:' ternary operator).  
     Writtey by Mark Mitchell <mark@codesourcery.com>
  
!    Copyright (C) 2000 Free Software Foundation, Inc.
  
  This file is part of GNU CC.
  
--- 5,11 ----
     non-overloadable operators (like the `?:' ternary operator).  
     Writtey by Mark Mitchell <mark@codesourcery.com>
  
!    Copyright (C) 2000, 2001 Free Software Foundation, Inc.
  
  This file is part of GNU CC.
  
*************** Boston, MA 02111-1307, USA.  */
*** 71,154 ****
     arguments are as for DEF_OPERATOR, but there is no need to provide
     an ASSIGNMENT_P argument; it is always zero.  */
  
! #define DEF_SIMPLE_OPERATOR(NAME, CODE, NEW_MANGLING, OLD_MANGLING, ARITY) \
!   DEF_OPERATOR(NAME, CODE, NEW_MANGLING, OLD_MANGLING, ARITY, 0)
  
  /* Use DEF_ASSN_OPERATOR to define an assignment operator.  Its
     arguments are as for DEF_OPERATOR, but there is no need to provide
     an ASSIGNMENT_P argument; it is always one.  */
  
! #define DEF_ASSN_OPERATOR(NAME, CODE, NEW_MANGLING, OLD_MANGLING, ARITY) \
!   DEF_OPERATOR(NAME, CODE, NEW_MANGLING, OLD_MANGLING, ARITY, 1)
  
  /* Memory allocation operators.  */
! DEF_SIMPLE_OPERATOR ("new", NEW_EXPR, "nw", "__nw", -1)
! DEF_SIMPLE_OPERATOR ("new []", VEC_NEW_EXPR, "na", "__vn", -1)
! DEF_SIMPLE_OPERATOR ("delete", DELETE_EXPR, "dl", "__dl", -1)
! DEF_SIMPLE_OPERATOR ("delete []", VEC_DELETE_EXPR, "da", "__vd", -1)
  
  /* Unary operators.  */
! DEF_SIMPLE_OPERATOR ("+", CONVERT_EXPR, "ps", "__pl", 1)
! DEF_SIMPLE_OPERATOR ("-", NEGATE_EXPR, "ng", "__mi", 1)
! DEF_SIMPLE_OPERATOR ("&", ADDR_EXPR, "ad", "__ad", 1)
! DEF_SIMPLE_OPERATOR ("*", INDIRECT_REF, "de", "__ml", 1)
! DEF_SIMPLE_OPERATOR ("~", BIT_NOT_EXPR, "co", "__co", 1)
! DEF_SIMPLE_OPERATOR ("!", TRUTH_NOT_EXPR, "nt", "__nt", 1)
! DEF_SIMPLE_OPERATOR ("++", PREINCREMENT_EXPR, "pp", "__pp", 1)
! DEF_SIMPLE_OPERATOR ("--", PREDECREMENT_EXPR, "mm", "__mm", 1)
! DEF_SIMPLE_OPERATOR ("sizeof", SIZEOF_EXPR, "sz", "__sz", 1)
  /* This is an extension.  */
! DEF_SIMPLE_OPERATOR ("alignof", ALIGNOF_EXPR, "v17alignof", "__al", 1)
  
  /* The cast operator.  */
! DEF_SIMPLE_OPERATOR ("", TYPE_EXPR, "cv", OPERATOR_TYPENAME_FORMAT, 1)
  
  /* Binary operators.  */
! DEF_SIMPLE_OPERATOR ("+", PLUS_EXPR, "pl", "__pl", 2)
! DEF_SIMPLE_OPERATOR ("-", MINUS_EXPR, "mi", "__mi", 2)
! DEF_SIMPLE_OPERATOR ("*", MULT_EXPR, "ml", "__ml", 2)
! DEF_SIMPLE_OPERATOR ("/", TRUNC_DIV_EXPR, "dv", "__dv", 2)
! DEF_SIMPLE_OPERATOR ("%", TRUNC_MOD_EXPR, "rm", "__md", 2)
! DEF_SIMPLE_OPERATOR ("&", BIT_AND_EXPR, "an", "__ad", 2)
! DEF_SIMPLE_OPERATOR ("|", BIT_IOR_EXPR, "or", "__or", 2)
! DEF_SIMPLE_OPERATOR ("^", BIT_XOR_EXPR, "eo", "__er", 2)
! DEF_SIMPLE_OPERATOR ("<<", LSHIFT_EXPR, "ls", "__ls", 2)
! DEF_SIMPLE_OPERATOR (">>", RSHIFT_EXPR, "rs", "__rs", 2)
! DEF_SIMPLE_OPERATOR ("==", EQ_EXPR, "eq", "__eq", 2)
! DEF_SIMPLE_OPERATOR ("!=", NE_EXPR, "ne", "__ne", 2)
! DEF_SIMPLE_OPERATOR ("<", LT_EXPR, "lt", "__lt", 2)
! DEF_SIMPLE_OPERATOR (">", GT_EXPR, "gt", "__gt", 2)
! DEF_SIMPLE_OPERATOR ("<=", LE_EXPR, "le", "__le", 2)
! DEF_SIMPLE_OPERATOR (">=", GE_EXPR, "ge", "__ge", 2)
! DEF_SIMPLE_OPERATOR ("&&", TRUTH_ANDIF_EXPR, "aa", "__aa", 2)
! DEF_SIMPLE_OPERATOR ("||", TRUTH_ORIF_EXPR, "oo", "__oo", 2)
! DEF_SIMPLE_OPERATOR (",", COMPOUND_EXPR, "cm", "__cm", 2)
! DEF_SIMPLE_OPERATOR ("->*", MEMBER_REF, "pm", "__rm", 2)
! DEF_SIMPLE_OPERATOR ("->", COMPONENT_REF, "pt", "__rf", 2)
! DEF_SIMPLE_OPERATOR ("[]", ARRAY_REF, "ix", "__vc", 2)
! DEF_SIMPLE_OPERATOR ("++", POSTINCREMENT_EXPR, "pp", "__pp", 2)
! DEF_SIMPLE_OPERATOR ("--", POSTDECREMENT_EXPR, "mm", "__mm", 2)
  /* These are extensions.  */
! DEF_SIMPLE_OPERATOR ("<?", MIN_EXPR, "v23min", "__mn", 2)
! DEF_SIMPLE_OPERATOR (">?", MAX_EXPR, "v23max", "__mx", 2)
  /* This one is needed for mangling.  */
! DEF_SIMPLE_OPERATOR ("::", SCOPE_REF, "sr", NULL, 2);
  
  /* Assignment operators.  */
! DEF_ASSN_OPERATOR ("=", NOP_EXPR, "aS", "__as", 2)
! DEF_ASSN_OPERATOR ("+=", PLUS_EXPR, "pL", "__apl", 2)
! DEF_ASSN_OPERATOR ("-=", MINUS_EXPR, "mI", "__ami", 2)
! DEF_ASSN_OPERATOR ("*=", MULT_EXPR, "mL", "__aml", 2)
! DEF_ASSN_OPERATOR ("/=", TRUNC_DIV_EXPR, "dV", "__adv", 2)
! DEF_ASSN_OPERATOR ("%=", TRUNC_MOD_EXPR, "rM", "__amd", 2)
! DEF_ASSN_OPERATOR ("&=", BIT_AND_EXPR, "aN", "__aad", 2)
! DEF_ASSN_OPERATOR ("|=", BIT_IOR_EXPR, "oR", "__aor", 2)
! DEF_ASSN_OPERATOR ("^=", BIT_XOR_EXPR, "eO", "__aer", 2)
! DEF_ASSN_OPERATOR ("<<=", LSHIFT_EXPR, "lS", "__als", 2)
! DEF_ASSN_OPERATOR (">>=", RSHIFT_EXPR, "rS", "__ars", 2)
  
  /* Ternary operators.  */
! DEF_SIMPLE_OPERATOR ("?:", COND_EXPR, "qu", "__cn", 3)
  
  /* Miscellaneous.  */
! DEF_SIMPLE_OPERATOR ("()", CALL_EXPR, "cl", "__cl", -1)
--- 71,154 ----
     arguments are as for DEF_OPERATOR, but there is no need to provide
     an ASSIGNMENT_P argument; it is always zero.  */
  
! #define DEF_SIMPLE_OPERATOR(NAME, CODE, MANGLING, ARITY) \
!   DEF_OPERATOR(NAME, CODE, MANGLING, ARITY, 0)
  
  /* Use DEF_ASSN_OPERATOR to define an assignment operator.  Its
     arguments are as for DEF_OPERATOR, but there is no need to provide
     an ASSIGNMENT_P argument; it is always one.  */
  
! #define DEF_ASSN_OPERATOR(NAME, CODE, MANGLING, ARITY) \
!   DEF_OPERATOR(NAME, CODE, MANGLING, ARITY, 1)
  
  /* Memory allocation operators.  */
! DEF_SIMPLE_OPERATOR ("new", NEW_EXPR, "nw", -1)
! DEF_SIMPLE_OPERATOR ("new []", VEC_NEW_EXPR, "na", -1)
! DEF_SIMPLE_OPERATOR ("delete", DELETE_EXPR, "dl", -1)
! DEF_SIMPLE_OPERATOR ("delete []", VEC_DELETE_EXPR, "da", -1)
  
  /* Unary operators.  */
! DEF_SIMPLE_OPERATOR ("+", CONVERT_EXPR, "ps", 1)
! DEF_SIMPLE_OPERATOR ("-", NEGATE_EXPR, "ng", 1)
! DEF_SIMPLE_OPERATOR ("&", ADDR_EXPR, "ad", 1)
! DEF_SIMPLE_OPERATOR ("*", INDIRECT_REF, "de", 1)
! DEF_SIMPLE_OPERATOR ("~", BIT_NOT_EXPR, "co", 1)
! DEF_SIMPLE_OPERATOR ("!", TRUTH_NOT_EXPR, "nt", 1)
! DEF_SIMPLE_OPERATOR ("++", PREINCREMENT_EXPR, "pp", 1)
! DEF_SIMPLE_OPERATOR ("--", PREDECREMENT_EXPR, "mm", 1)
! DEF_SIMPLE_OPERATOR ("sizeof", SIZEOF_EXPR, "sz", 1)
  /* This is an extension.  */
! DEF_SIMPLE_OPERATOR ("alignof", ALIGNOF_EXPR, "v17alignof", 1)
  
  /* The cast operator.  */
! DEF_SIMPLE_OPERATOR ("", TYPE_EXPR, "cv", 1)
  
  /* Binary operators.  */
! DEF_SIMPLE_OPERATOR ("+", PLUS_EXPR, "pl", 2)
! DEF_SIMPLE_OPERATOR ("-", MINUS_EXPR, "mi", 2)
! DEF_SIMPLE_OPERATOR ("*", MULT_EXPR, "ml", 2)
! DEF_SIMPLE_OPERATOR ("/", TRUNC_DIV_EXPR, "dv", 2)
! DEF_SIMPLE_OPERATOR ("%", TRUNC_MOD_EXPR, "rm", 2)
! DEF_SIMPLE_OPERATOR ("&", BIT_AND_EXPR, "an", 2)
! DEF_SIMPLE_OPERATOR ("|", BIT_IOR_EXPR, "or", 2)
! DEF_SIMPLE_OPERATOR ("^", BIT_XOR_EXPR, "eo", 2)
! DEF_SIMPLE_OPERATOR ("<<", LSHIFT_EXPR, "ls", 2)
! DEF_SIMPLE_OPERATOR (">>", RSHIFT_EXPR, "rs", 2)
! DEF_SIMPLE_OPERATOR ("==", EQ_EXPR, "eq", 2)
! DEF_SIMPLE_OPERATOR ("!=", NE_EXPR, "ne", 2)
! DEF_SIMPLE_OPERATOR ("<", LT_EXPR, "lt", 2)
! DEF_SIMPLE_OPERATOR (">", GT_EXPR, "gt", 2)
! DEF_SIMPLE_OPERATOR ("<=", LE_EXPR, "le", 2)
! DEF_SIMPLE_OPERATOR (">=", GE_EXPR, "ge", 2)
! DEF_SIMPLE_OPERATOR ("&&", TRUTH_ANDIF_EXPR, "aa", 2)
! DEF_SIMPLE_OPERATOR ("||", TRUTH_ORIF_EXPR, "oo", 2)
! DEF_SIMPLE_OPERATOR (",", COMPOUND_EXPR, "cm", 2)
! DEF_SIMPLE_OPERATOR ("->*", MEMBER_REF, "pm", 2)
! DEF_SIMPLE_OPERATOR ("->", COMPONENT_REF, "pt", 2)
! DEF_SIMPLE_OPERATOR ("[]", ARRAY_REF, "ix", 2)
! DEF_SIMPLE_OPERATOR ("++", POSTINCREMENT_EXPR, "pp", 2)
! DEF_SIMPLE_OPERATOR ("--", POSTDECREMENT_EXPR, "mm", 2)
  /* These are extensions.  */
! DEF_SIMPLE_OPERATOR ("<?", MIN_EXPR, "v23min", 2)
! DEF_SIMPLE_OPERATOR (">?", MAX_EXPR, "v23max", 2)
  /* This one is needed for mangling.  */
! DEF_SIMPLE_OPERATOR ("::", SCOPE_REF, "sr", 2);
  
  /* Assignment operators.  */
! DEF_ASSN_OPERATOR ("=", NOP_EXPR, "aS", 2)
! DEF_ASSN_OPERATOR ("+=", PLUS_EXPR, "pL", 2)
! DEF_ASSN_OPERATOR ("-=", MINUS_EXPR, "mI", 2)
! DEF_ASSN_OPERATOR ("*=", MULT_EXPR, "mL", 2)
! DEF_ASSN_OPERATOR ("/=", TRUNC_DIV_EXPR, "dV", 2)
! DEF_ASSN_OPERATOR ("%=", TRUNC_MOD_EXPR, "rM", 2)
! DEF_ASSN_OPERATOR ("&=", BIT_AND_EXPR, "aN", 2)
! DEF_ASSN_OPERATOR ("|=", BIT_IOR_EXPR, "oR", 2)
! DEF_ASSN_OPERATOR ("^=", BIT_XOR_EXPR, "eO", 2)
! DEF_ASSN_OPERATOR ("<<=", LSHIFT_EXPR, "lS", 2)
! DEF_ASSN_OPERATOR (">>=", RSHIFT_EXPR, "rS", 2)
  
  /* Ternary operators.  */
! DEF_SIMPLE_OPERATOR ("?:", COND_EXPR, "qu", 3)
  
  /* Miscellaneous.  */
! DEF_SIMPLE_OPERATOR ("()", CALL_EXPR, "cl", -1)
Index: cp/rtti.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/cp/rtti.c,v
retrieving revision 1.109.2.2
diff -c -p -r1.109.2.2 rtti.c
*** rtti.c	2001/03/20 22:03:46	1.109.2.2
--- rtti.c	2001/04/04 04:12:27
*************** get_tinfo_decl (type)
*** 325,330 ****
--- 325,338 ----
    tree name;
    tree d;
  
+   if (COMPLETE_TYPE_P (type) 
+       && TREE_CODE (TYPE_SIZE (type)) != INTEGER_CST)
+     {
+       cp_error ("cannot create type information for type `%T' because its size is variable", 
+ 		type);
+       return error_mark_node;
+     }
+ 
    if (TREE_CODE (type) == OFFSET_TYPE)
      type = TREE_TYPE (type);
    if (TREE_CODE (type) == METHOD_TYPE)


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]