public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
* [PATCH 03/13] Split rank_one_type_parm_func from rank_one_type
  2019-02-27 20:01 [PATCH 00/13] Splut rank_one_type in smaller functions Simon Marchi
                   ` (3 preceding siblings ...)
  2019-02-27 20:01 ` [PATCH 13/13] Remove unnecessary cases from rank_one_type's switch Simon Marchi
@ 2019-02-27 20:01 ` Simon Marchi
  2019-02-27 20:01 ` [PATCH 04/13] Split rank_one_type_parm_int " Simon Marchi
                   ` (8 subsequent siblings)
  13 siblings, 0 replies; 16+ messages in thread
From: Simon Marchi @ 2019-02-27 20:01 UTC (permalink / raw)
  To: gdb-patches; +Cc: Simon Marchi

gdb/ChangeLog:

	* gdbtypes.c (rank_one_type_parm_func): New function extracted
	from...
	(rank_one_type): ... this.
---
 gdb/gdbtypes.c | 22 +++++++++++++++-------
 1 file changed, 15 insertions(+), 7 deletions(-)

diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c
index cd0f753263..45cd04815c 100644
--- a/gdb/gdbtypes.c
+++ b/gdb/gdbtypes.c
@@ -3898,6 +3898,20 @@ rank_one_type_parm_array (struct type *parm, struct type *arg, struct value *val
     }
 }
 
+/* rank_one_type helper for when PARM's type code is TYPE_CODE_FUNC.  */
+
+static struct rank
+rank_one_type_parm_func (struct type *parm, struct type *arg, struct value *value)
+{
+  switch (TYPE_CODE (arg))
+    {
+    case TYPE_CODE_PTR:	/* funcptr -> func */
+      return rank_one_type (parm, TYPE_TARGET_TYPE (arg), NULL);
+    default:
+      return INCOMPATIBLE_TYPE_BADNESS;
+    }
+}
+
 /* Compare one type (PARM) for compatibility with another (ARG).
  * PARM is intended to be the parameter type of a function; and
  * ARG is the supplied argument's type.  This function tests if
@@ -3992,13 +4006,7 @@ rank_one_type (struct type *parm, struct type *arg, struct value *value)
     case TYPE_CODE_ARRAY:
       return rank_one_type_parm_array (parm, arg, value);
     case TYPE_CODE_FUNC:
-      switch (TYPE_CODE (arg))
-	{
-	case TYPE_CODE_PTR:	/* funcptr -> func */
-	  return rank_one_type (parm, TYPE_TARGET_TYPE (arg), NULL);
-	default:
-	  return INCOMPATIBLE_TYPE_BADNESS;
-	}
+      return rank_one_type_parm_func (parm, arg, value);
     case TYPE_CODE_INT:
       switch (TYPE_CODE (arg))
 	{
-- 
2.21.0

^ permalink raw reply	[flat|nested] 16+ messages in thread

* [PATCH 04/13] Split rank_one_type_parm_int from rank_one_type
  2019-02-27 20:01 [PATCH 00/13] Splut rank_one_type in smaller functions Simon Marchi
                   ` (4 preceding siblings ...)
  2019-02-27 20:01 ` [PATCH 03/13] Split rank_one_type_parm_func from rank_one_type Simon Marchi
@ 2019-02-27 20:01 ` Simon Marchi
  2019-02-27 20:01 ` [PATCH 09/13] Split rank_one_type_parm_float " Simon Marchi
                   ` (7 subsequent siblings)
  13 siblings, 0 replies; 16+ messages in thread
From: Simon Marchi @ 2019-02-27 20:01 UTC (permalink / raw)
  To: gdb-patches; +Cc: Simon Marchi

gdb/ChangeLog:

	* gdbtypes.c (rank_one_type_parm_int): New function extracted
	from...
	(rank_one_type): ... this.
---
 gdb/gdbtypes.c | 173 +++++++++++++++++++++++++------------------------
 1 file changed, 90 insertions(+), 83 deletions(-)

diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c
index 45cd04815c..237969532b 100644
--- a/gdb/gdbtypes.c
+++ b/gdb/gdbtypes.c
@@ -3912,6 +3912,95 @@ rank_one_type_parm_func (struct type *parm, struct type *arg, struct value *valu
     }
 }
 
+/* rank_one_type helper for when PARM's type code is TYPE_CODE_INT.  */
+
+static struct rank
+rank_one_type_parm_int (struct type *parm, struct type *arg, struct value *value)
+{
+  switch (TYPE_CODE (arg))
+    {
+    case TYPE_CODE_INT:
+      if (TYPE_LENGTH (arg) == TYPE_LENGTH (parm))
+	{
+	  /* Deal with signed, unsigned, and plain chars and
+	     signed and unsigned ints.  */
+	  if (TYPE_NOSIGN (parm))
+	    {
+	      /* This case only for character types.  */
+	      if (TYPE_NOSIGN (arg))
+		return EXACT_MATCH_BADNESS;	/* plain char -> plain char */
+	      else		/* signed/unsigned char -> plain char */
+		return INTEGER_CONVERSION_BADNESS;
+	    }
+	  else if (TYPE_UNSIGNED (parm))
+	    {
+	      if (TYPE_UNSIGNED (arg))
+		{
+		  /* unsigned int -> unsigned int, or
+		     unsigned long -> unsigned long */
+		  if (integer_types_same_name_p (TYPE_NAME (parm),
+						 TYPE_NAME (arg)))
+		    return EXACT_MATCH_BADNESS;
+		  else if (integer_types_same_name_p (TYPE_NAME (arg),
+						      "int")
+			   && integer_types_same_name_p (TYPE_NAME (parm),
+							 "long"))
+		    /* unsigned int -> unsigned long */
+		    return INTEGER_PROMOTION_BADNESS;
+		  else
+		    /* unsigned long -> unsigned int */
+		    return INTEGER_CONVERSION_BADNESS;
+		}
+	      else
+		{
+		  if (integer_types_same_name_p (TYPE_NAME (arg),
+						 "long")
+		      && integer_types_same_name_p (TYPE_NAME (parm),
+						    "int"))
+		    /* signed long -> unsigned int */
+		    return INTEGER_CONVERSION_BADNESS;
+		  else
+		    /* signed int/long -> unsigned int/long */
+		    return INTEGER_CONVERSION_BADNESS;
+		}
+	    }
+	  else if (!TYPE_NOSIGN (arg) && !TYPE_UNSIGNED (arg))
+	    {
+	      if (integer_types_same_name_p (TYPE_NAME (parm),
+					     TYPE_NAME (arg)))
+		return EXACT_MATCH_BADNESS;
+	      else if (integer_types_same_name_p (TYPE_NAME (arg),
+						  "int")
+		       && integer_types_same_name_p (TYPE_NAME (parm),
+						     "long"))
+		return INTEGER_PROMOTION_BADNESS;
+	      else
+		return INTEGER_CONVERSION_BADNESS;
+	    }
+	  else
+	    return INTEGER_CONVERSION_BADNESS;
+	}
+      else if (TYPE_LENGTH (arg) < TYPE_LENGTH (parm))
+	return INTEGER_PROMOTION_BADNESS;
+      else
+	return INTEGER_CONVERSION_BADNESS;
+    case TYPE_CODE_ENUM:
+    case TYPE_CODE_FLAGS:
+    case TYPE_CODE_CHAR:
+    case TYPE_CODE_RANGE:
+    case TYPE_CODE_BOOL:
+      if (TYPE_DECLARED_CLASS (arg))
+	return INCOMPATIBLE_TYPE_BADNESS;
+      return INTEGER_PROMOTION_BADNESS;
+    case TYPE_CODE_FLT:
+      return INT_FLOAT_CONVERSION_BADNESS;
+    case TYPE_CODE_PTR:
+      return NS_POINTER_CONVERSION_BADNESS;
+    default:
+      return INCOMPATIBLE_TYPE_BADNESS;
+    }
+}
+
 /* Compare one type (PARM) for compatibility with another (ARG).
  * PARM is intended to be the parameter type of a function; and
  * ARG is the supplied argument's type.  This function tests if
@@ -4008,89 +4097,7 @@ rank_one_type (struct type *parm, struct type *arg, struct value *value)
     case TYPE_CODE_FUNC:
       return rank_one_type_parm_func (parm, arg, value);
     case TYPE_CODE_INT:
-      switch (TYPE_CODE (arg))
-	{
-	case TYPE_CODE_INT:
-	  if (TYPE_LENGTH (arg) == TYPE_LENGTH (parm))
-	    {
-	      /* Deal with signed, unsigned, and plain chars and
-	         signed and unsigned ints.  */
-	      if (TYPE_NOSIGN (parm))
-		{
-		  /* This case only for character types.  */
-		  if (TYPE_NOSIGN (arg))
-		    return EXACT_MATCH_BADNESS;	/* plain char -> plain char */
-		  else		/* signed/unsigned char -> plain char */
-		    return INTEGER_CONVERSION_BADNESS;
-		}
-	      else if (TYPE_UNSIGNED (parm))
-		{
-		  if (TYPE_UNSIGNED (arg))
-		    {
-		      /* unsigned int -> unsigned int, or 
-			 unsigned long -> unsigned long */
-		      if (integer_types_same_name_p (TYPE_NAME (parm), 
-						     TYPE_NAME (arg)))
-			return EXACT_MATCH_BADNESS;
-		      else if (integer_types_same_name_p (TYPE_NAME (arg), 
-							  "int")
-			       && integer_types_same_name_p (TYPE_NAME (parm),
-							     "long"))
-			/* unsigned int -> unsigned long */
-			return INTEGER_PROMOTION_BADNESS;
-		      else
-			/* unsigned long -> unsigned int */
-			return INTEGER_CONVERSION_BADNESS;
-		    }
-		  else
-		    {
-		      if (integer_types_same_name_p (TYPE_NAME (arg), 
-						     "long")
-			  && integer_types_same_name_p (TYPE_NAME (parm), 
-							"int"))
-			/* signed long -> unsigned int */
-			return INTEGER_CONVERSION_BADNESS;
-		      else
-			/* signed int/long -> unsigned int/long */
-			return INTEGER_CONVERSION_BADNESS;
-		    }
-		}
-	      else if (!TYPE_NOSIGN (arg) && !TYPE_UNSIGNED (arg))
-		{
-		  if (integer_types_same_name_p (TYPE_NAME (parm), 
-						 TYPE_NAME (arg)))
-		    return EXACT_MATCH_BADNESS;
-		  else if (integer_types_same_name_p (TYPE_NAME (arg), 
-						      "int")
-			   && integer_types_same_name_p (TYPE_NAME (parm), 
-							 "long"))
-		    return INTEGER_PROMOTION_BADNESS;
-		  else
-		    return INTEGER_CONVERSION_BADNESS;
-		}
-	      else
-		return INTEGER_CONVERSION_BADNESS;
-	    }
-	  else if (TYPE_LENGTH (arg) < TYPE_LENGTH (parm))
-	    return INTEGER_PROMOTION_BADNESS;
-	  else
-	    return INTEGER_CONVERSION_BADNESS;
-	case TYPE_CODE_ENUM:
-	case TYPE_CODE_FLAGS:
-	case TYPE_CODE_CHAR:
-	case TYPE_CODE_RANGE:
-	case TYPE_CODE_BOOL:
-	  if (TYPE_DECLARED_CLASS (arg))
-	    return INCOMPATIBLE_TYPE_BADNESS;
-	  return INTEGER_PROMOTION_BADNESS;
-	case TYPE_CODE_FLT:
-	  return INT_FLOAT_CONVERSION_BADNESS;
-	case TYPE_CODE_PTR:
-	  return NS_POINTER_CONVERSION_BADNESS;
-	default:
-	  return INCOMPATIBLE_TYPE_BADNESS;
-	}
-      break;
+      return rank_one_type_parm_int (parm, arg, value);
     case TYPE_CODE_ENUM:
       switch (TYPE_CODE (arg))
 	{
-- 
2.21.0

^ permalink raw reply	[flat|nested] 16+ messages in thread

* [PATCH 13/13] Remove unnecessary cases from rank_one_type's switch
  2019-02-27 20:01 [PATCH 00/13] Splut rank_one_type in smaller functions Simon Marchi
                   ` (2 preceding siblings ...)
  2019-02-27 20:01 ` [PATCH 01/13] Split rank_one_type_parm_ptr " Simon Marchi
@ 2019-02-27 20:01 ` Simon Marchi
  2019-02-27 20:01 ` [PATCH 03/13] Split rank_one_type_parm_func from rank_one_type Simon Marchi
                   ` (9 subsequent siblings)
  13 siblings, 0 replies; 16+ messages in thread
From: Simon Marchi @ 2019-02-27 20:01 UTC (permalink / raw)
  To: gdb-patches; +Cc: Simon Marchi

We return INCOMPATIBLE_TYPE_BADNESS for all these type codes, so we might as
well just let them go to the default case.

Incidentally, this patch also makes this false positive error go away when
compiling with gcc (Ubuntu 7.3.0-27ubuntu1~18.04) 7.3.0, default compiler on
Ubuntu 18.04.

  CXX    gdbtypes.o
/home/smarchi/src/binutils-gdb/gdb/gdbtypes.c: In function ‘rank rank_one_type(type*, type*, value*)’:
/home/smarchi/src/binutils-gdb/gdb/gdbtypes.c:4259:1: error: control reaches end of non-void function [-Werror=return-type]
 }
 ^

gdb/ChangeLog:

	* gdbtypes.c (rank_one_type): Remove unnecessary cases from switch.
---
 gdb/gdbtypes.c | 33 ---------------------------------
 1 file changed, 33 deletions(-)

diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c
index dc054b9272..f4ca025b63 100644
--- a/gdb/gdbtypes.c
+++ b/gdb/gdbtypes.c
@@ -4309,41 +4309,8 @@ rank_one_type (struct type *parm, struct type *arg, struct value *value)
       return rank_one_type_parm_complex (parm, arg, value);
     case TYPE_CODE_STRUCT:
       return rank_one_type_parm_struct (parm, arg, value);
-    case TYPE_CODE_UNION:
-      switch (TYPE_CODE (arg))
-	{
-	case TYPE_CODE_UNION:
-	default:
-	  return INCOMPATIBLE_TYPE_BADNESS;
-	}
-      break;
-    case TYPE_CODE_MEMBERPTR:
-      switch (TYPE_CODE (arg))
-	{
-	default:
-	  return INCOMPATIBLE_TYPE_BADNESS;
-	}
-      break;
-    case TYPE_CODE_METHOD:
-      switch (TYPE_CODE (arg))
-	{
-
-	default:
-	  return INCOMPATIBLE_TYPE_BADNESS;
-	}
-      break;
-    case TYPE_CODE_REF:
-      switch (TYPE_CODE (arg))
-	{
-
-	default:
-	  return INCOMPATIBLE_TYPE_BADNESS;
-	}
-
-      break;
     case TYPE_CODE_SET:
       return rank_one_type_parm_set (parm, arg, value);
-    case TYPE_CODE_VOID:
     default:
       return INCOMPATIBLE_TYPE_BADNESS;
     }				/* switch (TYPE_CODE (arg)) */
-- 
2.21.0

^ permalink raw reply	[flat|nested] 16+ messages in thread

* [PATCH 01/13] Split rank_one_type_parm_ptr from rank_one_type
  2019-02-27 20:01 [PATCH 00/13] Splut rank_one_type in smaller functions Simon Marchi
  2019-02-27 20:01 ` [PATCH 12/13] Split rank_one_type_parm_set from rank_one_type Simon Marchi
  2019-02-27 20:01 ` [PATCH 02/13] Split rank_one_type_parm_array " Simon Marchi
@ 2019-02-27 20:01 ` Simon Marchi
  2019-02-27 20:01 ` [PATCH 13/13] Remove unnecessary cases from rank_one_type's switch Simon Marchi
                   ` (10 subsequent siblings)
  13 siblings, 0 replies; 16+ messages in thread
From: Simon Marchi @ 2019-02-27 20:01 UTC (permalink / raw)
  To: gdb-patches; +Cc: Simon Marchi

gdb/ChangeLog:

	* gdbtypes.c (rank_one_type_parm_ptr): New function extracted
	from...
	(rank_one_type): ... this.
---
 gdb/gdbtypes.c | 136 ++++++++++++++++++++++++++-----------------------
 1 file changed, 73 insertions(+), 63 deletions(-)

diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c
index b5f269241c..dc4ef56576 100644
--- a/gdb/gdbtypes.c
+++ b/gdb/gdbtypes.c
@@ -3810,7 +3810,78 @@ type_not_associated (const struct type *type)
   return (prop && TYPE_DYN_PROP_KIND (prop) == PROP_CONST
          && !TYPE_DYN_PROP_ADDR (prop));
 }
-\f
+
+/* rank_one_type helper for when PARM's type code is TYPE_CODE_PTR.  */
+
+static struct rank
+rank_one_type_parm_ptr (struct type *parm, struct type *arg, struct value *value)
+{
+  struct rank rank = {0,0};
+
+  switch (TYPE_CODE (arg))
+    {
+    case TYPE_CODE_PTR:
+
+      /* Allowed pointer conversions are:
+	 (a) pointer to void-pointer conversion.  */
+      if (TYPE_CODE (TYPE_TARGET_TYPE (parm)) == TYPE_CODE_VOID)
+	return VOID_PTR_CONVERSION_BADNESS;
+
+      /* (b) pointer to ancestor-pointer conversion.  */
+      rank.subrank = distance_to_ancestor (TYPE_TARGET_TYPE (parm),
+					   TYPE_TARGET_TYPE (arg),
+					   0);
+      if (rank.subrank >= 0)
+	return sum_ranks (BASE_PTR_CONVERSION_BADNESS, rank);
+
+      return INCOMPATIBLE_TYPE_BADNESS;
+    case TYPE_CODE_ARRAY:
+      {
+	struct type *t1 = TYPE_TARGET_TYPE (parm);
+	struct type *t2 = TYPE_TARGET_TYPE (arg);
+
+	if (types_equal (t1, t2))
+	  {
+	    /* Make sure they are CV equal.  */
+	    if (TYPE_CONST (t1) != TYPE_CONST (t2))
+	      rank.subrank |= CV_CONVERSION_CONST;
+	    if (TYPE_VOLATILE (t1) != TYPE_VOLATILE (t2))
+	      rank.subrank |= CV_CONVERSION_VOLATILE;
+	    if (rank.subrank != 0)
+	      return sum_ranks (CV_CONVERSION_BADNESS, rank);
+	    return EXACT_MATCH_BADNESS;
+	  }
+	return INCOMPATIBLE_TYPE_BADNESS;
+      }
+    case TYPE_CODE_FUNC:
+      return rank_one_type (TYPE_TARGET_TYPE (parm), arg, NULL);
+    case TYPE_CODE_INT:
+      if (value != NULL && TYPE_CODE (value_type (value)) == TYPE_CODE_INT)
+	{
+	  if (value_as_long (value) == 0)
+	    {
+	      /* Null pointer conversion: allow it to be cast to a pointer.
+		 [4.10.1 of C++ standard draft n3290]  */
+	      return NULL_POINTER_CONVERSION_BADNESS;
+	    }
+	  else
+	    {
+	      /* If type checking is disabled, allow the conversion.  */
+	      if (!strict_type_checking)
+		return NS_INTEGER_POINTER_CONVERSION_BADNESS;
+	    }
+	}
+      /* fall through  */
+    case TYPE_CODE_ENUM:
+    case TYPE_CODE_FLAGS:
+    case TYPE_CODE_CHAR:
+    case TYPE_CODE_RANGE:
+    case TYPE_CODE_BOOL:
+    default:
+      return INCOMPATIBLE_TYPE_BADNESS;
+    }
+}
+
 /* Compare one type (PARM) for compatibility with another (ARG).
  * PARM is intended to be the parameter type of a function; and
  * ARG is the supplied argument's type.  This function tests if
@@ -3901,68 +3972,7 @@ rank_one_type (struct type *parm, struct type *arg, struct value *value)
   switch (TYPE_CODE (parm))
     {
     case TYPE_CODE_PTR:
-      switch (TYPE_CODE (arg))
-	{
-	case TYPE_CODE_PTR:
-
-	  /* Allowed pointer conversions are:
-	     (a) pointer to void-pointer conversion.  */
-	  if (TYPE_CODE (TYPE_TARGET_TYPE (parm)) == TYPE_CODE_VOID)
-	    return VOID_PTR_CONVERSION_BADNESS;
-
-	  /* (b) pointer to ancestor-pointer conversion.  */
-	  rank.subrank = distance_to_ancestor (TYPE_TARGET_TYPE (parm),
-	                                       TYPE_TARGET_TYPE (arg),
-	                                       0);
-	  if (rank.subrank >= 0)
-	    return sum_ranks (BASE_PTR_CONVERSION_BADNESS, rank);
-
-	  return INCOMPATIBLE_TYPE_BADNESS;
-	case TYPE_CODE_ARRAY:
-	  {
-	    struct type *t1 = TYPE_TARGET_TYPE (parm);
-	    struct type *t2 = TYPE_TARGET_TYPE (arg);
-
-	    if (types_equal (t1, t2))
-	      {
-		/* Make sure they are CV equal.  */
-		if (TYPE_CONST (t1) != TYPE_CONST (t2))
-		  rank.subrank |= CV_CONVERSION_CONST;
-		if (TYPE_VOLATILE (t1) != TYPE_VOLATILE (t2))
-		  rank.subrank |= CV_CONVERSION_VOLATILE;
-		if (rank.subrank != 0)
-		  return sum_ranks (CV_CONVERSION_BADNESS, rank);
-		return EXACT_MATCH_BADNESS;
-	      }
-	    return INCOMPATIBLE_TYPE_BADNESS;
-	  }
-	case TYPE_CODE_FUNC:
-	  return rank_one_type (TYPE_TARGET_TYPE (parm), arg, NULL);
-	case TYPE_CODE_INT:
-	  if (value != NULL && TYPE_CODE (value_type (value)) == TYPE_CODE_INT)
-	    {
-	      if (value_as_long (value) == 0)
-		{
-		  /* Null pointer conversion: allow it to be cast to a pointer.
-		     [4.10.1 of C++ standard draft n3290]  */
-		  return NULL_POINTER_CONVERSION_BADNESS;
-		}
-	      else
-		{
-		  /* If type checking is disabled, allow the conversion.  */
-		  if (!strict_type_checking)
-		    return NS_INTEGER_POINTER_CONVERSION_BADNESS;
-		}
-	    }
-	  /* fall through  */
-	case TYPE_CODE_ENUM:
-	case TYPE_CODE_FLAGS:
-	case TYPE_CODE_CHAR:
-	case TYPE_CODE_RANGE:
-	case TYPE_CODE_BOOL:
-	default:
-	  return INCOMPATIBLE_TYPE_BADNESS;
-	}
+      return rank_one_type_parm_ptr (parm, arg, value);
     case TYPE_CODE_ARRAY:
       switch (TYPE_CODE (arg))
 	{
-- 
2.21.0

^ permalink raw reply	[flat|nested] 16+ messages in thread

* [PATCH 09/13] Split rank_one_type_parm_float from rank_one_type
  2019-02-27 20:01 [PATCH 00/13] Splut rank_one_type in smaller functions Simon Marchi
                   ` (5 preceding siblings ...)
  2019-02-27 20:01 ` [PATCH 04/13] Split rank_one_type_parm_int " Simon Marchi
@ 2019-02-27 20:01 ` Simon Marchi
  2019-02-27 20:01 ` [PATCH 10/13] Split rank_one_type_parm_complex " Simon Marchi
                   ` (6 subsequent siblings)
  13 siblings, 0 replies; 16+ messages in thread
From: Simon Marchi @ 2019-02-27 20:01 UTC (permalink / raw)
  To: gdb-patches; +Cc: Simon Marchi

gdb/ChangeLog:

	* gdbtypes.c (rank_one_type_parm_float): New function extracted
	from...
	(rank_one_type): ... this.
---
 gdb/gdbtypes.c | 45 ++++++++++++++++++++++++++-------------------
 1 file changed, 26 insertions(+), 19 deletions(-)

diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c
index 1e51d756bc..f9aa14d724 100644
--- a/gdb/gdbtypes.c
+++ b/gdb/gdbtypes.c
@@ -4121,6 +4121,31 @@ rank_one_type_parm_bool (struct type *parm, struct type *arg, struct value *valu
     }
 }
 
+/* rank_one_type helper for when PARM's type code is TYPE_CODE_FLOAT.  */
+
+static struct rank
+rank_one_type_parm_float (struct type *parm, struct type *arg, struct value *value)
+{
+  switch (TYPE_CODE (arg))
+    {
+    case TYPE_CODE_FLT:
+      if (TYPE_LENGTH (arg) < TYPE_LENGTH (parm))
+	return FLOAT_PROMOTION_BADNESS;
+      else if (TYPE_LENGTH (arg) == TYPE_LENGTH (parm))
+	return EXACT_MATCH_BADNESS;
+      else
+	return FLOAT_CONVERSION_BADNESS;
+    case TYPE_CODE_INT:
+    case TYPE_CODE_BOOL:
+    case TYPE_CODE_ENUM:
+    case TYPE_CODE_RANGE:
+    case TYPE_CODE_CHAR:
+      return INT_FLOAT_CONVERSION_BADNESS;
+    default:
+      return INCOMPATIBLE_TYPE_BADNESS;
+    }
+}
+
 /* Compare one type (PARM) for compatibility with another (ARG).
  * PARM is intended to be the parameter type of a function; and
  * ARG is the supplied argument's type.  This function tests if
@@ -4227,25 +4252,7 @@ rank_one_type (struct type *parm, struct type *arg, struct value *value)
     case TYPE_CODE_BOOL:
       return rank_one_type_parm_bool (parm, arg, value);
     case TYPE_CODE_FLT:
-      switch (TYPE_CODE (arg))
-	{
-	case TYPE_CODE_FLT:
-	  if (TYPE_LENGTH (arg) < TYPE_LENGTH (parm))
-	    return FLOAT_PROMOTION_BADNESS;
-	  else if (TYPE_LENGTH (arg) == TYPE_LENGTH (parm))
-	    return EXACT_MATCH_BADNESS;
-	  else
-	    return FLOAT_CONVERSION_BADNESS;
-	case TYPE_CODE_INT:
-	case TYPE_CODE_BOOL:
-	case TYPE_CODE_ENUM:
-	case TYPE_CODE_RANGE:
-	case TYPE_CODE_CHAR:
-	  return INT_FLOAT_CONVERSION_BADNESS;
-	default:
-	  return INCOMPATIBLE_TYPE_BADNESS;
-	}
-      break;
+      return rank_one_type_parm_float (parm, arg, value);
     case TYPE_CODE_COMPLEX:
       switch (TYPE_CODE (arg))
 	{		/* Strictly not needed for C++, but...  */
-- 
2.21.0

^ permalink raw reply	[flat|nested] 16+ messages in thread

* [PATCH 10/13] Split rank_one_type_parm_complex from rank_one_type
  2019-02-27 20:01 [PATCH 00/13] Splut rank_one_type in smaller functions Simon Marchi
                   ` (6 preceding siblings ...)
  2019-02-27 20:01 ` [PATCH 09/13] Split rank_one_type_parm_float " Simon Marchi
@ 2019-02-27 20:01 ` Simon Marchi
  2019-02-27 20:01 ` [PATCH 08/13] Split rank_one_type_parm_bool " Simon Marchi
                   ` (5 subsequent siblings)
  13 siblings, 0 replies; 16+ messages in thread
From: Simon Marchi @ 2019-02-27 20:01 UTC (permalink / raw)
  To: gdb-patches; +Cc: Simon Marchi

gdb/ChangeLog:

	* gdbtypes.c (rank_one_type_parm_complex): New function extracted
	from...
	(rank_one_type): ... this.
---
 gdb/gdbtypes.c | 27 +++++++++++++++++----------
 1 file changed, 17 insertions(+), 10 deletions(-)

diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c
index f9aa14d724..3cf6ba87f7 100644
--- a/gdb/gdbtypes.c
+++ b/gdb/gdbtypes.c
@@ -4146,6 +4146,22 @@ rank_one_type_parm_float (struct type *parm, struct type *arg, struct value *val
     }
 }
 
+/* rank_one_type helper for when PARM's type code is TYPE_CODE_COMPLEX.  */
+
+static struct rank
+rank_one_type_parm_complex (struct type *parm, struct type *arg, struct value *value)
+{
+  switch (TYPE_CODE (arg))
+    {		/* Strictly not needed for C++, but...  */
+    case TYPE_CODE_FLT:
+      return FLOAT_PROMOTION_BADNESS;
+    case TYPE_CODE_COMPLEX:
+      return EXACT_MATCH_BADNESS;
+    default:
+      return INCOMPATIBLE_TYPE_BADNESS;
+    }
+}
+
 /* Compare one type (PARM) for compatibility with another (ARG).
  * PARM is intended to be the parameter type of a function; and
  * ARG is the supplied argument's type.  This function tests if
@@ -4254,16 +4270,7 @@ rank_one_type (struct type *parm, struct type *arg, struct value *value)
     case TYPE_CODE_FLT:
       return rank_one_type_parm_float (parm, arg, value);
     case TYPE_CODE_COMPLEX:
-      switch (TYPE_CODE (arg))
-	{		/* Strictly not needed for C++, but...  */
-	case TYPE_CODE_FLT:
-	  return FLOAT_PROMOTION_BADNESS;
-	case TYPE_CODE_COMPLEX:
-	  return EXACT_MATCH_BADNESS;
-	default:
-	  return INCOMPATIBLE_TYPE_BADNESS;
-	}
-      break;
+      return rank_one_type_parm_complex (parm, arg, value);
     case TYPE_CODE_STRUCT:
       switch (TYPE_CODE (arg))
 	{
-- 
2.21.0

^ permalink raw reply	[flat|nested] 16+ messages in thread

* [PATCH 02/13] Split rank_one_type_parm_array from rank_one_type
  2019-02-27 20:01 [PATCH 00/13] Splut rank_one_type in smaller functions Simon Marchi
  2019-02-27 20:01 ` [PATCH 12/13] Split rank_one_type_parm_set from rank_one_type Simon Marchi
@ 2019-02-27 20:01 ` Simon Marchi
  2019-02-27 20:01 ` [PATCH 01/13] Split rank_one_type_parm_ptr " Simon Marchi
                   ` (11 subsequent siblings)
  13 siblings, 0 replies; 16+ messages in thread
From: Simon Marchi @ 2019-02-27 20:01 UTC (permalink / raw)
  To: gdb-patches; +Cc: Simon Marchi

gdb/ChangeLog:

	* gdbtypes.c (rank_one_type_parm_array): New function extracted
	from...
	(rank_one_type): ... this.
---
 gdb/gdbtypes.c | 26 +++++++++++++++++---------
 1 file changed, 17 insertions(+), 9 deletions(-)

diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c
index dc4ef56576..cd0f753263 100644
--- a/gdb/gdbtypes.c
+++ b/gdb/gdbtypes.c
@@ -3882,6 +3882,22 @@ rank_one_type_parm_ptr (struct type *parm, struct type *arg, struct value *value
     }
 }
 
+/* rank_one_type helper for when PARM's type code is TYPE_CODE_ARRAY.  */
+
+static struct rank
+rank_one_type_parm_array (struct type *parm, struct type *arg, struct value *value)
+{
+  switch (TYPE_CODE (arg))
+    {
+    case TYPE_CODE_PTR:
+    case TYPE_CODE_ARRAY:
+      return rank_one_type (TYPE_TARGET_TYPE (parm),
+			    TYPE_TARGET_TYPE (arg), NULL);
+    default:
+      return INCOMPATIBLE_TYPE_BADNESS;
+    }
+}
+
 /* Compare one type (PARM) for compatibility with another (ARG).
  * PARM is intended to be the parameter type of a function; and
  * ARG is the supplied argument's type.  This function tests if
@@ -3974,15 +3990,7 @@ rank_one_type (struct type *parm, struct type *arg, struct value *value)
     case TYPE_CODE_PTR:
       return rank_one_type_parm_ptr (parm, arg, value);
     case TYPE_CODE_ARRAY:
-      switch (TYPE_CODE (arg))
-	{
-	case TYPE_CODE_PTR:
-	case TYPE_CODE_ARRAY:
-	  return rank_one_type (TYPE_TARGET_TYPE (parm), 
-				TYPE_TARGET_TYPE (arg), NULL);
-	default:
-	  return INCOMPATIBLE_TYPE_BADNESS;
-	}
+      return rank_one_type_parm_array (parm, arg, value);
     case TYPE_CODE_FUNC:
       switch (TYPE_CODE (arg))
 	{
-- 
2.21.0

^ permalink raw reply	[flat|nested] 16+ messages in thread

* [PATCH 00/13] Splut rank_one_type in smaller functions
@ 2019-02-27 20:01 Simon Marchi
  2019-02-27 20:01 ` [PATCH 12/13] Split rank_one_type_parm_set from rank_one_type Simon Marchi
                   ` (13 more replies)
  0 siblings, 14 replies; 16+ messages in thread
From: Simon Marchi @ 2019-02-27 20:01 UTC (permalink / raw)
  To: gdb-patches; +Cc: Simon Marchi

The initial reason for this series is to investigate the following error
I get when building on Ubuntu 18.04, using the default compiler (gcc
(Ubuntu 7.3.0-27ubuntu1~18.04) 7.3.0).

  CXX    gdbtypes.o
/home/smarchi/src/binutils-gdb/gdb/gdbtypes.c: In function ‘rank rank_one_type(type*, type*, value*)’:
/home/smarchi/src/binutils-gdb/gdb/gdbtypes.c:4259:1: error: control reaches end of non-void function [-Werror=return-type]
 }
 ^

I wanted to see if this was a false positive specific to this gcc
version (I assume it is, since I haven't seen anybody report this error
before).  To do that, I started to manually verify each execution path
of that function and see if execution can really reach the end.
However, due to the size and complexity of the switch in that function,
it was not very practical.  So I started to split that switch in smaller
functions (one per type code of PARM).  At some point, the error
disappeared.  It turns out that it's the last patch that makes the error
disappear.

But still, I think this series is useful, since it gets rid of a false
positive error and makes the code a little bit more readable at the same
time.

Copyright assignment status: I am currently not covered by a copyright
assignment, so I will push this once it is sorted out.  This series
might now actually be significant w.r.t. copyright, since it is just
moving some code around, but in any case it is not really urgent to
merge it either.

I ran this series through the buildbot, it reported no new failure.

Simon Marchi (13):
  Split rank_one_type_parm_ptr from rank_one_type
  Split rank_one_type_parm_array from rank_one_type
  Split rank_one_type_parm_func from rank_one_type
  Split rank_one_type_parm_int from rank_one_type
  Split rank_one_type_parm_enum from rank_one_type
  Split rank_one_type_parm_char from rank_one_type
  Split rank_one_type_parm_range from rank_one_type
  Split rank_one_type_parm_bool from rank_one_type
  Split rank_one_type_parm_float from rank_one_type
  Split rank_one_type_parm_complex from rank_one_type
  Split rank_one_type_parm_struct from rank_one_type
  Split rank_one_type_parm_set from rank_one_type
  Remove unnecessary cases from rank_one_type's switch

 gdb/gdbtypes.c | 742 ++++++++++++++++++++++++++-----------------------
 1 file changed, 400 insertions(+), 342 deletions(-)

-- 
2.21.0

^ permalink raw reply	[flat|nested] 16+ messages in thread

* [PATCH 08/13] Split rank_one_type_parm_bool from rank_one_type
  2019-02-27 20:01 [PATCH 00/13] Splut rank_one_type in smaller functions Simon Marchi
                   ` (7 preceding siblings ...)
  2019-02-27 20:01 ` [PATCH 10/13] Split rank_one_type_parm_complex " Simon Marchi
@ 2019-02-27 20:01 ` Simon Marchi
  2019-02-27 20:06 ` [PATCH 06/13] Split rank_one_type_parm_char " Simon Marchi
                   ` (4 subsequent siblings)
  13 siblings, 0 replies; 16+ messages in thread
From: Simon Marchi @ 2019-02-27 20:01 UTC (permalink / raw)
  To: gdb-patches; +Cc: Simon Marchi

gdb/ChangeLog:

	* gdbtypes.c (rank_one_type_parm_bool): New function extracted
	from...
	(rank_one_type): ... this.
---
 gdb/gdbtypes.c | 57 ++++++++++++++++++++++++++++----------------------
 1 file changed, 32 insertions(+), 25 deletions(-)

diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c
index 9c4c66d44d..1e51d756bc 100644
--- a/gdb/gdbtypes.c
+++ b/gdb/gdbtypes.c
@@ -4090,6 +4090,37 @@ rank_one_type_parm_range (struct type *parm, struct type *arg, struct value *val
     }
 }
 
+/* rank_one_type helper for when PARM's type code is TYPE_CODE_BOOL.  */
+
+static struct rank
+rank_one_type_parm_bool (struct type *parm, struct type *arg, struct value *value)
+{
+  switch (TYPE_CODE (arg))
+    {
+      /* n3290 draft, section 4.12.1 (conv.bool):
+
+	 "A prvalue of arithmetic, unscoped enumeration, pointer, or
+	 pointer to member type can be converted to a prvalue of type
+	 bool.  A zero value, null pointer value, or null member pointer
+	 value is converted to false; any other value is converted to
+	 true.  A prvalue of type std::nullptr_t can be converted to a
+	 prvalue of type bool; the resulting value is false."  */
+    case TYPE_CODE_INT:
+    case TYPE_CODE_CHAR:
+    case TYPE_CODE_ENUM:
+    case TYPE_CODE_FLT:
+    case TYPE_CODE_MEMBERPTR:
+    case TYPE_CODE_PTR:
+      return BOOL_CONVERSION_BADNESS;
+    case TYPE_CODE_RANGE:
+      return INCOMPATIBLE_TYPE_BADNESS;
+    case TYPE_CODE_BOOL:
+      return EXACT_MATCH_BADNESS;
+    default:
+      return INCOMPATIBLE_TYPE_BADNESS;
+    }
+}
+
 /* Compare one type (PARM) for compatibility with another (ARG).
  * PARM is intended to be the parameter type of a function; and
  * ARG is the supplied argument's type.  This function tests if
@@ -4194,31 +4225,7 @@ rank_one_type (struct type *parm, struct type *arg, struct value *value)
     case TYPE_CODE_RANGE:
       return rank_one_type_parm_range (parm, arg, value);
     case TYPE_CODE_BOOL:
-      switch (TYPE_CODE (arg))
-	{
-	  /* n3290 draft, section 4.12.1 (conv.bool):
-
-	     "A prvalue of arithmetic, unscoped enumeration, pointer, or
-	     pointer to member type can be converted to a prvalue of type
-	     bool.  A zero value, null pointer value, or null member pointer
-	     value is converted to false; any other value is converted to
-	     true.  A prvalue of type std::nullptr_t can be converted to a
-	     prvalue of type bool; the resulting value is false."  */
-	case TYPE_CODE_INT:
-	case TYPE_CODE_CHAR:
-	case TYPE_CODE_ENUM:
-	case TYPE_CODE_FLT:
-	case TYPE_CODE_MEMBERPTR:
-	case TYPE_CODE_PTR:
-	  return BOOL_CONVERSION_BADNESS;
-	case TYPE_CODE_RANGE:
-	  return INCOMPATIBLE_TYPE_BADNESS;
-	case TYPE_CODE_BOOL:
-	  return EXACT_MATCH_BADNESS;
-	default:
-	  return INCOMPATIBLE_TYPE_BADNESS;
-	}
-      break;
+      return rank_one_type_parm_bool (parm, arg, value);
     case TYPE_CODE_FLT:
       switch (TYPE_CODE (arg))
 	{
-- 
2.21.0

^ permalink raw reply	[flat|nested] 16+ messages in thread

* [PATCH 12/13] Split rank_one_type_parm_set from rank_one_type
  2019-02-27 20:01 [PATCH 00/13] Splut rank_one_type in smaller functions Simon Marchi
@ 2019-02-27 20:01 ` Simon Marchi
  2019-02-27 20:01 ` [PATCH 02/13] Split rank_one_type_parm_array " Simon Marchi
                   ` (12 subsequent siblings)
  13 siblings, 0 replies; 16+ messages in thread
From: Simon Marchi @ 2019-02-27 20:01 UTC (permalink / raw)
  To: gdb-patches; +Cc: Simon Marchi

gdb/ChangeLog:

	* gdbtypes.c (rank_one_type_parm_set): New function extracted
	from...
	(rank_one_type): ... this.
---
 gdb/gdbtypes.c | 27 +++++++++++++++++----------
 1 file changed, 17 insertions(+), 10 deletions(-)

diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c
index ef6b17651a..dc054b9272 100644
--- a/gdb/gdbtypes.c
+++ b/gdb/gdbtypes.c
@@ -4182,6 +4182,22 @@ rank_one_type_parm_struct (struct type *parm, struct type *arg, struct value *va
     }
 }
 
+/* rank_one_type helper for when PARM's type code is TYPE_CODE_SET.  */
+
+static struct rank
+rank_one_type_parm_set (struct type *parm, struct type *arg, struct value *value)
+{
+  switch (TYPE_CODE (arg))
+    {
+      /* Not in C++ */
+    case TYPE_CODE_SET:
+      return rank_one_type (TYPE_FIELD_TYPE (parm, 0),
+			    TYPE_FIELD_TYPE (arg, 0), NULL);
+    default:
+      return INCOMPATIBLE_TYPE_BADNESS;
+    }
+}
+
 /* Compare one type (PARM) for compatibility with another (ARG).
  * PARM is intended to be the parameter type of a function; and
  * ARG is the supplied argument's type.  This function tests if
@@ -4326,16 +4342,7 @@ rank_one_type (struct type *parm, struct type *arg, struct value *value)
 
       break;
     case TYPE_CODE_SET:
-      switch (TYPE_CODE (arg))
-	{
-	  /* Not in C++ */
-	case TYPE_CODE_SET:
-	  return rank_one_type (TYPE_FIELD_TYPE (parm, 0), 
-				TYPE_FIELD_TYPE (arg, 0), NULL);
-	default:
-	  return INCOMPATIBLE_TYPE_BADNESS;
-	}
-      break;
+      return rank_one_type_parm_set (parm, arg, value);
     case TYPE_CODE_VOID:
     default:
       return INCOMPATIBLE_TYPE_BADNESS;
-- 
2.21.0

^ permalink raw reply	[flat|nested] 16+ messages in thread

* [PATCH 06/13] Split rank_one_type_parm_char from rank_one_type
  2019-02-27 20:01 [PATCH 00/13] Splut rank_one_type in smaller functions Simon Marchi
                   ` (8 preceding siblings ...)
  2019-02-27 20:01 ` [PATCH 08/13] Split rank_one_type_parm_bool " Simon Marchi
@ 2019-02-27 20:06 ` Simon Marchi
  2019-02-27 20:06 ` [PATCH 11/13] Split rank_one_type_parm_struct " Simon Marchi
                   ` (3 subsequent siblings)
  13 siblings, 0 replies; 16+ messages in thread
From: Simon Marchi @ 2019-02-27 20:06 UTC (permalink / raw)
  To: gdb-patches; +Cc: Simon Marchi

gdb/ChangeLog:

	* gdbtypes.c (rank_one_type_parm_char): New function extracted
	from...
	(rank_one_type): ... this.
---
 gdb/gdbtypes.c | 89 +++++++++++++++++++++++++++-----------------------
 1 file changed, 48 insertions(+), 41 deletions(-)

diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c
index a0874b3d7d..daf3261e9b 100644
--- a/gdb/gdbtypes.c
+++ b/gdb/gdbtypes.c
@@ -4023,6 +4023,53 @@ rank_one_type_parm_enum (struct type *parm, struct type *arg, struct value *valu
     }
 }
 
+/* rank_one_type helper for when PARM's type code is TYPE_CODE_CHAR.  */
+
+static struct rank
+rank_one_type_parm_char (struct type *parm, struct type *arg, struct value *value)
+{
+  switch (TYPE_CODE (arg))
+    {
+    case TYPE_CODE_RANGE:
+    case TYPE_CODE_BOOL:
+    case TYPE_CODE_ENUM:
+      if (TYPE_DECLARED_CLASS (arg))
+	return INCOMPATIBLE_TYPE_BADNESS;
+      return INTEGER_CONVERSION_BADNESS;
+    case TYPE_CODE_FLT:
+      return INT_FLOAT_CONVERSION_BADNESS;
+    case TYPE_CODE_INT:
+      if (TYPE_LENGTH (arg) > TYPE_LENGTH (parm))
+	return INTEGER_CONVERSION_BADNESS;
+      else if (TYPE_LENGTH (arg) < TYPE_LENGTH (parm))
+	return INTEGER_PROMOTION_BADNESS;
+      /* fall through */
+    case TYPE_CODE_CHAR:
+      /* Deal with signed, unsigned, and plain chars for C++ and
+	 with int cases falling through from previous case.  */
+      if (TYPE_NOSIGN (parm))
+	{
+	  if (TYPE_NOSIGN (arg))
+	    return EXACT_MATCH_BADNESS;
+	  else
+	    return INTEGER_CONVERSION_BADNESS;
+	}
+      else if (TYPE_UNSIGNED (parm))
+	{
+	  if (TYPE_UNSIGNED (arg))
+	    return EXACT_MATCH_BADNESS;
+	  else
+	    return INTEGER_PROMOTION_BADNESS;
+	}
+      else if (!TYPE_NOSIGN (arg) && !TYPE_UNSIGNED (arg))
+	return EXACT_MATCH_BADNESS;
+      else
+	return INTEGER_CONVERSION_BADNESS;
+    default:
+      return INCOMPATIBLE_TYPE_BADNESS;
+    }
+}
+
 /* Compare one type (PARM) for compatibility with another (ARG).
  * PARM is intended to be the parameter type of a function; and
  * ARG is the supplied argument's type.  This function tests if
@@ -4123,47 +4170,7 @@ rank_one_type (struct type *parm, struct type *arg, struct value *value)
     case TYPE_CODE_ENUM:
       return rank_one_type_parm_enum (parm, arg, value);
     case TYPE_CODE_CHAR:
-      switch (TYPE_CODE (arg))
-	{
-	case TYPE_CODE_RANGE:
-	case TYPE_CODE_BOOL:
-	case TYPE_CODE_ENUM:
-	  if (TYPE_DECLARED_CLASS (arg))
-	    return INCOMPATIBLE_TYPE_BADNESS;
-	  return INTEGER_CONVERSION_BADNESS;
-	case TYPE_CODE_FLT:
-	  return INT_FLOAT_CONVERSION_BADNESS;
-	case TYPE_CODE_INT:
-	  if (TYPE_LENGTH (arg) > TYPE_LENGTH (parm))
-	    return INTEGER_CONVERSION_BADNESS;
-	  else if (TYPE_LENGTH (arg) < TYPE_LENGTH (parm))
-	    return INTEGER_PROMOTION_BADNESS;
-	  /* fall through */
-	case TYPE_CODE_CHAR:
-	  /* Deal with signed, unsigned, and plain chars for C++ and
-	     with int cases falling through from previous case.  */
-	  if (TYPE_NOSIGN (parm))
-	    {
-	      if (TYPE_NOSIGN (arg))
-		return EXACT_MATCH_BADNESS;
-	      else
-		return INTEGER_CONVERSION_BADNESS;
-	    }
-	  else if (TYPE_UNSIGNED (parm))
-	    {
-	      if (TYPE_UNSIGNED (arg))
-		return EXACT_MATCH_BADNESS;
-	      else
-		return INTEGER_PROMOTION_BADNESS;
-	    }
-	  else if (!TYPE_NOSIGN (arg) && !TYPE_UNSIGNED (arg))
-	    return EXACT_MATCH_BADNESS;
-	  else
-	    return INTEGER_CONVERSION_BADNESS;
-	default:
-	  return INCOMPATIBLE_TYPE_BADNESS;
-	}
-      break;
+      return rank_one_type_parm_char (parm, arg, value);
     case TYPE_CODE_RANGE:
       switch (TYPE_CODE (arg))
 	{
-- 
2.21.0

^ permalink raw reply	[flat|nested] 16+ messages in thread

* [PATCH 07/13] Split rank_one_type_parm_range from rank_one_type
  2019-02-27 20:01 [PATCH 00/13] Splut rank_one_type in smaller functions Simon Marchi
                   ` (10 preceding siblings ...)
  2019-02-27 20:06 ` [PATCH 11/13] Split rank_one_type_parm_struct " Simon Marchi
@ 2019-02-27 20:06 ` Simon Marchi
  2019-02-27 20:06 ` [PATCH 05/13] Split rank_one_type_parm_enum " Simon Marchi
  2019-02-27 21:46 ` [PATCH 00/13] Splut rank_one_type in smaller functions Tom Tromey
  13 siblings, 0 replies; 16+ messages in thread
From: Simon Marchi @ 2019-02-27 20:06 UTC (permalink / raw)
  To: gdb-patches; +Cc: Simon Marchi

gdb/ChangeLog:

	* gdbtypes.c (rank_one_type_parm_range): New function extracted
	from...
	(rank_one_type): ... this.
---
 gdb/gdbtypes.c | 35 +++++++++++++++++++++--------------
 1 file changed, 21 insertions(+), 14 deletions(-)

diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c
index daf3261e9b..9c4c66d44d 100644
--- a/gdb/gdbtypes.c
+++ b/gdb/gdbtypes.c
@@ -4070,6 +4070,26 @@ rank_one_type_parm_char (struct type *parm, struct type *arg, struct value *valu
     }
 }
 
+/* rank_one_type helper for when PARM's type code is TYPE_CODE_RANGE.  */
+
+static struct rank
+rank_one_type_parm_range (struct type *parm, struct type *arg, struct value *value)
+{
+  switch (TYPE_CODE (arg))
+    {
+    case TYPE_CODE_INT:
+    case TYPE_CODE_CHAR:
+    case TYPE_CODE_RANGE:
+    case TYPE_CODE_BOOL:
+    case TYPE_CODE_ENUM:
+      return INTEGER_CONVERSION_BADNESS;
+    case TYPE_CODE_FLT:
+      return INT_FLOAT_CONVERSION_BADNESS;
+    default:
+      return INCOMPATIBLE_TYPE_BADNESS;
+    }
+}
+
 /* Compare one type (PARM) for compatibility with another (ARG).
  * PARM is intended to be the parameter type of a function; and
  * ARG is the supplied argument's type.  This function tests if
@@ -4172,20 +4192,7 @@ rank_one_type (struct type *parm, struct type *arg, struct value *value)
     case TYPE_CODE_CHAR:
       return rank_one_type_parm_char (parm, arg, value);
     case TYPE_CODE_RANGE:
-      switch (TYPE_CODE (arg))
-	{
-	case TYPE_CODE_INT:
-	case TYPE_CODE_CHAR:
-	case TYPE_CODE_RANGE:
-	case TYPE_CODE_BOOL:
-	case TYPE_CODE_ENUM:
-	  return INTEGER_CONVERSION_BADNESS;
-	case TYPE_CODE_FLT:
-	  return INT_FLOAT_CONVERSION_BADNESS;
-	default:
-	  return INCOMPATIBLE_TYPE_BADNESS;
-	}
-      break;
+      return rank_one_type_parm_range (parm, arg, value);
     case TYPE_CODE_BOOL:
       switch (TYPE_CODE (arg))
 	{
-- 
2.21.0

^ permalink raw reply	[flat|nested] 16+ messages in thread

* [PATCH 05/13] Split rank_one_type_parm_enum from rank_one_type
  2019-02-27 20:01 [PATCH 00/13] Splut rank_one_type in smaller functions Simon Marchi
                   ` (11 preceding siblings ...)
  2019-02-27 20:06 ` [PATCH 07/13] Split rank_one_type_parm_range " Simon Marchi
@ 2019-02-27 20:06 ` Simon Marchi
  2019-02-27 21:46 ` [PATCH 00/13] Splut rank_one_type in smaller functions Tom Tromey
  13 siblings, 0 replies; 16+ messages in thread
From: Simon Marchi @ 2019-02-27 20:06 UTC (permalink / raw)
  To: gdb-patches; +Cc: Simon Marchi

gdb/ChangeLog:

	* gdbtypes.c (rank_one_type_parm_enum): New function extracted
	from...
	(rank_one_type): ... this.
---
 gdb/gdbtypes.c | 39 +++++++++++++++++++++++----------------
 1 file changed, 23 insertions(+), 16 deletions(-)

diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c
index 237969532b..a0874b3d7d 100644
--- a/gdb/gdbtypes.c
+++ b/gdb/gdbtypes.c
@@ -4001,6 +4001,28 @@ rank_one_type_parm_int (struct type *parm, struct type *arg, struct value *value
     }
 }
 
+/* rank_one_type helper for when PARM's type code is TYPE_CODE_ENUM.  */
+
+static struct rank
+rank_one_type_parm_enum (struct type *parm, struct type *arg, struct value *value)
+{
+  switch (TYPE_CODE (arg))
+    {
+    case TYPE_CODE_INT:
+    case TYPE_CODE_CHAR:
+    case TYPE_CODE_RANGE:
+    case TYPE_CODE_BOOL:
+    case TYPE_CODE_ENUM:
+      if (TYPE_DECLARED_CLASS (parm) || TYPE_DECLARED_CLASS (arg))
+	return INCOMPATIBLE_TYPE_BADNESS;
+      return INTEGER_CONVERSION_BADNESS;
+    case TYPE_CODE_FLT:
+      return INT_FLOAT_CONVERSION_BADNESS;
+    default:
+      return INCOMPATIBLE_TYPE_BADNESS;
+    }
+}
+
 /* Compare one type (PARM) for compatibility with another (ARG).
  * PARM is intended to be the parameter type of a function; and
  * ARG is the supplied argument's type.  This function tests if
@@ -4099,22 +4121,7 @@ rank_one_type (struct type *parm, struct type *arg, struct value *value)
     case TYPE_CODE_INT:
       return rank_one_type_parm_int (parm, arg, value);
     case TYPE_CODE_ENUM:
-      switch (TYPE_CODE (arg))
-	{
-	case TYPE_CODE_INT:
-	case TYPE_CODE_CHAR:
-	case TYPE_CODE_RANGE:
-	case TYPE_CODE_BOOL:
-	case TYPE_CODE_ENUM:
-	  if (TYPE_DECLARED_CLASS (parm) || TYPE_DECLARED_CLASS (arg))
-	    return INCOMPATIBLE_TYPE_BADNESS;
-	  return INTEGER_CONVERSION_BADNESS;
-	case TYPE_CODE_FLT:
-	  return INT_FLOAT_CONVERSION_BADNESS;
-	default:
-	  return INCOMPATIBLE_TYPE_BADNESS;
-	}
-      break;
+      return rank_one_type_parm_enum (parm, arg, value);
     case TYPE_CODE_CHAR:
       switch (TYPE_CODE (arg))
 	{
-- 
2.21.0

^ permalink raw reply	[flat|nested] 16+ messages in thread

* [PATCH 11/13] Split rank_one_type_parm_struct from rank_one_type
  2019-02-27 20:01 [PATCH 00/13] Splut rank_one_type in smaller functions Simon Marchi
                   ` (9 preceding siblings ...)
  2019-02-27 20:06 ` [PATCH 06/13] Split rank_one_type_parm_char " Simon Marchi
@ 2019-02-27 20:06 ` Simon Marchi
  2019-02-27 20:06 ` [PATCH 07/13] Split rank_one_type_parm_range " Simon Marchi
                   ` (2 subsequent siblings)
  13 siblings, 0 replies; 16+ messages in thread
From: Simon Marchi @ 2019-02-27 20:06 UTC (permalink / raw)
  To: gdb-patches; +Cc: Simon Marchi

gdb/ChangeLog:

	* gdbtypes.c (rank_one_type_parm_struct): New function extracted
	from...
	(rank_one_type): ... this.
---
 gdb/gdbtypes.c | 33 +++++++++++++++++++++------------
 1 file changed, 21 insertions(+), 12 deletions(-)

diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c
index 3cf6ba87f7..ef6b17651a 100644
--- a/gdb/gdbtypes.c
+++ b/gdb/gdbtypes.c
@@ -4162,6 +4162,26 @@ rank_one_type_parm_complex (struct type *parm, struct type *arg, struct value *v
     }
 }
 
+/* rank_one_type helper for when PARM's type code is TYPE_CODE_STRUCT.  */
+
+static struct rank
+rank_one_type_parm_struct (struct type *parm, struct type *arg, struct value *value)
+{
+  struct rank rank = {0, 0};
+
+  switch (TYPE_CODE (arg))
+    {
+    case TYPE_CODE_STRUCT:
+      /* Check for derivation */
+      rank.subrank = distance_to_ancestor (parm, arg, 0);
+      if (rank.subrank >= 0)
+	return sum_ranks (BASE_CONVERSION_BADNESS, rank);
+      /* fall through */
+    default:
+      return INCOMPATIBLE_TYPE_BADNESS;
+    }
+}
+
 /* Compare one type (PARM) for compatibility with another (ARG).
  * PARM is intended to be the parameter type of a function; and
  * ARG is the supplied argument's type.  This function tests if
@@ -4272,18 +4292,7 @@ rank_one_type (struct type *parm, struct type *arg, struct value *value)
     case TYPE_CODE_COMPLEX:
       return rank_one_type_parm_complex (parm, arg, value);
     case TYPE_CODE_STRUCT:
-      switch (TYPE_CODE (arg))
-	{
-	case TYPE_CODE_STRUCT:
-	  /* Check for derivation */
-	  rank.subrank = distance_to_ancestor (parm, arg, 0);
-	  if (rank.subrank >= 0)
-	    return sum_ranks (BASE_CONVERSION_BADNESS, rank);
-	  /* fall through */
-	default:
-	  return INCOMPATIBLE_TYPE_BADNESS;
-	}
-      break;
+      return rank_one_type_parm_struct (parm, arg, value);
     case TYPE_CODE_UNION:
       switch (TYPE_CODE (arg))
 	{
-- 
2.21.0

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH 00/13] Splut rank_one_type in smaller functions
  2019-02-27 20:01 [PATCH 00/13] Splut rank_one_type in smaller functions Simon Marchi
                   ` (12 preceding siblings ...)
  2019-02-27 20:06 ` [PATCH 05/13] Split rank_one_type_parm_enum " Simon Marchi
@ 2019-02-27 21:46 ` Tom Tromey
  2019-03-09 13:30   ` Simon Marchi
  13 siblings, 1 reply; 16+ messages in thread
From: Tom Tromey @ 2019-02-27 21:46 UTC (permalink / raw)
  To: Simon Marchi; +Cc: gdb-patches

>>>>> "Simon" == Simon Marchi <simon.marchi@efficios.com> writes:

Simon> But still, I think this series is useful, since it gets rid of a false
Simon> positive error and makes the code a little bit more readable at the same
Simon> time.

I think so too.  I spot-checked this and it seems fine to me.

Tom

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH 00/13] Splut rank_one_type in smaller functions
  2019-02-27 21:46 ` [PATCH 00/13] Splut rank_one_type in smaller functions Tom Tromey
@ 2019-03-09 13:30   ` Simon Marchi
  0 siblings, 0 replies; 16+ messages in thread
From: Simon Marchi @ 2019-03-09 13:30 UTC (permalink / raw)
  To: Tom Tromey, Simon Marchi; +Cc: gdb-patches

On 2019-02-27 4:46 p.m., Tom Tromey wrote:
>>>>>> "Simon" == Simon Marchi <simon.marchi@efficios.com> writes:
> 
> Simon> But still, I think this series is useful, since it gets rid of a false
> Simon> positive error and makes the code a little bit more readable at the same
> Simon> time.
> 
> I think so too.  I spot-checked this and it seems fine to me.
> 
> Tom
> 

Thanks, I pushed this patch series.

Simon

^ permalink raw reply	[flat|nested] 16+ messages in thread

end of thread, other threads:[~2019-03-09 13:30 UTC | newest]

Thread overview: 16+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-02-27 20:01 [PATCH 00/13] Splut rank_one_type in smaller functions Simon Marchi
2019-02-27 20:01 ` [PATCH 12/13] Split rank_one_type_parm_set from rank_one_type Simon Marchi
2019-02-27 20:01 ` [PATCH 02/13] Split rank_one_type_parm_array " Simon Marchi
2019-02-27 20:01 ` [PATCH 01/13] Split rank_one_type_parm_ptr " Simon Marchi
2019-02-27 20:01 ` [PATCH 13/13] Remove unnecessary cases from rank_one_type's switch Simon Marchi
2019-02-27 20:01 ` [PATCH 03/13] Split rank_one_type_parm_func from rank_one_type Simon Marchi
2019-02-27 20:01 ` [PATCH 04/13] Split rank_one_type_parm_int " Simon Marchi
2019-02-27 20:01 ` [PATCH 09/13] Split rank_one_type_parm_float " Simon Marchi
2019-02-27 20:01 ` [PATCH 10/13] Split rank_one_type_parm_complex " Simon Marchi
2019-02-27 20:01 ` [PATCH 08/13] Split rank_one_type_parm_bool " Simon Marchi
2019-02-27 20:06 ` [PATCH 06/13] Split rank_one_type_parm_char " Simon Marchi
2019-02-27 20:06 ` [PATCH 11/13] Split rank_one_type_parm_struct " Simon Marchi
2019-02-27 20:06 ` [PATCH 07/13] Split rank_one_type_parm_range " Simon Marchi
2019-02-27 20:06 ` [PATCH 05/13] Split rank_one_type_parm_enum " Simon Marchi
2019-02-27 21:46 ` [PATCH 00/13] Splut rank_one_type in smaller functions Tom Tromey
2019-03-09 13:30   ` Simon Marchi

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).