aboutsummaryrefslogtreecommitdiff
path: root/gcc/ada
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@adacore.com>2022-06-22 20:20:06 +0200
committerPierre-Marie de Rodat <derodat@adacore.com>2022-07-13 10:01:19 +0000
commitd927cb527cb17547b24d2b52ddd29e8fad621a66 (patch)
tree5404883db9c71dac2a3ad88bee9417f1cb43e383 /gcc/ada
parent2b8c12348da3eb770968b718a9ace9fb8fba246f (diff)
downloadgcc-d927cb527cb17547b24d2b52ddd29e8fad621a66.zip
gcc-d927cb527cb17547b24d2b52ddd29e8fad621a66.tar.gz
gcc-d927cb527cb17547b24d2b52ddd29e8fad621a66.tar.bz2
[Ada] Fix internal error on comparison with access function parameter
It comes from an overzealous assertion. gcc/ada/ * gcc-interface/utils2.cc (build_binary_op) <EQ_EXPR>: Also accept pointer-to-function types that are not variant of each other.
Diffstat (limited to 'gcc/ada')
-rw-r--r--gcc/ada/gcc-interface/utils2.cc15
1 files changed, 10 insertions, 5 deletions
diff --git a/gcc/ada/gcc-interface/utils2.cc b/gcc/ada/gcc-interface/utils2.cc
index 0dcc9ff..4dfe29d 100644
--- a/gcc/ada/gcc-interface/utils2.cc
+++ b/gcc/ada/gcc-interface/utils2.cc
@@ -1134,12 +1134,17 @@ build_binary_op (enum tree_code op_code, tree result_type,
else if (POINTER_TYPE_P (left_base_type)
&& POINTER_TYPE_P (right_base_type))
{
+ tree left_ref_type = TREE_TYPE (left_base_type);
+ tree right_ref_type = TREE_TYPE (right_base_type);
+
/* Anonymous access types in Ada 2005 can point to different
- members of a tagged type hierarchy. */
- gcc_assert (TYPE_MAIN_VARIANT (TREE_TYPE (left_base_type))
- == TYPE_MAIN_VARIANT (TREE_TYPE (right_base_type))
- || (TYPE_ALIGN_OK (TREE_TYPE (left_base_type))
- && TYPE_ALIGN_OK (TREE_TYPE (right_base_type))));
+ members of a tagged hierarchy or different function types. */
+ gcc_assert (TYPE_MAIN_VARIANT (left_ref_type)
+ == TYPE_MAIN_VARIANT (right_ref_type)
+ || (TYPE_ALIGN_OK (left_ref_type)
+ && TYPE_ALIGN_OK (right_ref_type))
+ || (TREE_CODE (left_ref_type) == FUNCTION_TYPE
+ && TREE_CODE (right_ref_type) == FUNCTION_TYPE));
best_type = left_base_type;
}