aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorIain Sandoe <iain@sandoe.co.uk>2020-10-31 09:25:47 +0000
committerIain Sandoe <iain@sandoe.co.uk>2020-11-04 08:06:13 +0000
commit878cffbd9e6e1b138a6e0d362e7b29bc0a259940 (patch)
tree68cbe595c0a38ade3813ac1e25e631f12998840e /gcc
parentc19e44ac8dbc9af07e5e671edfa03ab5b08649c5 (diff)
downloadgcc-878cffbd9e6e1b138a6e0d362e7b29bc0a259940.zip
gcc-878cffbd9e6e1b138a6e0d362e7b29bc0a259940.tar.gz
gcc-878cffbd9e6e1b138a6e0d362e7b29bc0a259940.tar.bz2
Objective-C++ : Fix ICE in potential_constant_expression_1.
We cannot, as things stand, handle Objective-C tree codes in the switch and deal with this by calling out to a function that has a dummy version when Objective-C is not enabled. Because of the way the logic works (with a fall through to a 'sorry' in case of unhandled expressions), the function reports cases that are known to be unsuitable for constant exprs. The dummy function always reports 'false' and thus will fall through to the 'sorry'. gcc/c-family/ChangeLog: * c-objc.h (objc_non_constant_expr_p): New. * stub-objc.c (objc_non_constant_expr_p): New. gcc/cp/ChangeLog: * constexpr.c (potential_constant_expression_1): Handle expressions known to be non-constant for Objective-C. gcc/objc/ChangeLog: * objc-act.c (objc_non_constant_expr_p): New.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/c-family/c-objc.h1
-rw-r--r--gcc/c-family/stub-objc.c6
-rw-r--r--gcc/cp/constexpr.c2
-rw-r--r--gcc/objc/objc-act.c16
4 files changed, 23 insertions, 2 deletions
diff --git a/gcc/c-family/c-objc.h b/gcc/c-family/c-objc.h
index 6025283..4577e4f 100644
--- a/gcc/c-family/c-objc.h
+++ b/gcc/c-family/c-objc.h
@@ -101,6 +101,7 @@ extern void objc_add_synthesize_declaration (location_t, tree);
extern void objc_add_dynamic_declaration (location_t, tree);
extern const char * objc_maybe_printable_name (tree, int);
extern bool objc_is_property_ref (tree);
+extern bool objc_non_constant_expr_p (tree);
extern bool objc_string_ref_type_p (tree);
extern void objc_check_format_arg (tree, tree);
extern void objc_finish_function (void);
diff --git a/gcc/c-family/stub-objc.c b/gcc/c-family/stub-objc.c
index c30f0b3..d017acf 100644
--- a/gcc/c-family/stub-objc.c
+++ b/gcc/c-family/stub-objc.c
@@ -331,6 +331,12 @@ objc_is_property_ref (tree ARG_UNUSED (node))
return 0;
}
+bool
+objc_non_constant_expr_p (tree)
+{
+ return 0;
+}
+
tree
objc_maybe_build_component_ref (tree ARG_UNUSED (datum), tree ARG_UNUSED (component))
{
diff --git a/gcc/cp/constexpr.c b/gcc/cp/constexpr.c
index 7033a49..b6f9c43 100644
--- a/gcc/cp/constexpr.c
+++ b/gcc/cp/constexpr.c
@@ -8413,7 +8413,7 @@ potential_constant_expression_1 (tree t, bool want_rval, bool strict, bool now,
return false;
default:
- if (objc_is_property_ref (t))
+ if (objc_non_constant_expr_p (t))
return false;
sorry ("unexpected AST of kind %s", get_tree_code_name (TREE_CODE (t)));
diff --git a/gcc/objc/objc-act.c b/gcc/objc/objc-act.c
index 0393bc4..c0d07ae 100644
--- a/gcc/objc/objc-act.c
+++ b/gcc/objc/objc-act.c
@@ -1720,7 +1720,6 @@ objc_build_class_component_ref (tree class_name, tree property_ident)
}
-
/* This is used because we don't want to expose PROPERTY_REF to the
C/C++ frontends. Maybe we should! */
bool
@@ -1732,6 +1731,21 @@ objc_is_property_ref (tree node)
return false;
}
+/* We use this to report tree codes that are known to be invalid in const-
+ expression contexts. */
+bool
+objc_non_constant_expr_p (tree node)
+{
+ switch (TREE_CODE (node))
+ {
+ default:
+ return false;
+ case MESSAGE_SEND_EXPR:
+ case PROPERTY_REF:
+ return true;
+ }
+}
+
/* This function builds a setter call for a PROPERTY_REF (real, for a
declared property, or artificial, for a dot-syntax accessor which
is not corresponding to a property). 'lhs' must be a PROPERTY_REF