aboutsummaryrefslogtreecommitdiff
path: root/gcc/c
diff options
context:
space:
mode:
authorDavid Malcolm <dmalcolm@redhat.com>2015-11-23 21:00:13 +0000
committerDavid Malcolm <dmalcolm@gcc.gnu.org>2015-11-23 21:00:13 +0000
commitcbd03aee24f57b42a82a119e4182b442ef3b8db3 (patch)
tree058f5735877ed92a7541da52bb3cfb4c72b3c5a4 /gcc/c
parentcd9ec14217a566fa0ae12ccf34534cbb7680f5ab (diff)
downloadgcc-cbd03aee24f57b42a82a119e4182b442ef3b8db3.zip
gcc-cbd03aee24f57b42a82a119e4182b442ef3b8db3.tar.gz
gcc-cbd03aee24f57b42a82a119e4182b442ef3b8db3.tar.bz2
Fix PR objc/68438 (uninitialized source ranges)
gcc/c/ChangeLog: PR objc/68438 * c-parser.c (c_parser_postfix_expression): Set up source ranges for various Objective-C constructs: Class.name syntax, @selector(), @protocol(), @encode(), and [] message syntax. gcc/testsuite/ChangeLog: PR objc/68438 * objc.dg/plugin: New subdirectory. * objc.dg/plugin/diagnostic-test-expressions-1.m: New test file. * objc.dg/plugin/plugin.exp: New file, based on gcc.dg/plugin/plugin.exp. From-SVN: r230775
Diffstat (limited to 'gcc/c')
-rw-r--r--gcc/c/ChangeLog7
-rw-r--r--gcc/c/c-parser.c17
2 files changed, 21 insertions, 3 deletions
diff --git a/gcc/c/ChangeLog b/gcc/c/ChangeLog
index 96c5823..1e9314d 100644
--- a/gcc/c/ChangeLog
+++ b/gcc/c/ChangeLog
@@ -1,3 +1,10 @@
+2015-11-23 David Malcolm <dmalcolm@redhat.com>
+
+ PR objc/68438
+ * c-parser.c (c_parser_postfix_expression): Set up source ranges
+ for various Objective-C constructs: Class.name syntax,
+ @selector(), @protocol(), @encode(), and [] message syntax.
+
2015-11-20 David Malcolm <dmalcolm@redhat.com>
PR 62314
diff --git a/gcc/c/c-parser.c b/gcc/c/c-parser.c
index 7b10764..18e9957 100644
--- a/gcc/c/c-parser.c
+++ b/gcc/c/c-parser.c
@@ -7338,10 +7338,13 @@ c_parser_postfix_expression (c_parser *parser)
expr.value = error_mark_node;
break;
}
- component = c_parser_peek_token (parser)->value;
+ c_token *component_tok = c_parser_peek_token (parser);
+ component = component_tok->value;
+ location_t end_loc = component_tok->get_finish ();
c_parser_consume_token (parser);
expr.value = objc_build_class_component_ref (class_name,
component);
+ set_c_expr_source_range (&expr, loc, end_loc);
break;
}
default:
@@ -7816,9 +7819,11 @@ c_parser_postfix_expression (c_parser *parser)
}
{
tree sel = c_parser_objc_selector_arg (parser);
+ location_t close_loc = c_parser_peek_token (parser)->location;
c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
"expected %<)%>");
expr.value = objc_build_selector_expr (loc, sel);
+ set_c_expr_source_range (&expr, loc, close_loc);
}
break;
case RID_AT_PROTOCOL:
@@ -7839,9 +7844,11 @@ c_parser_postfix_expression (c_parser *parser)
{
tree id = c_parser_peek_token (parser)->value;
c_parser_consume_token (parser);
+ location_t close_loc = c_parser_peek_token (parser)->location;
c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
"expected %<)%>");
expr.value = objc_build_protocol_expr (id);
+ set_c_expr_source_range (&expr, loc, close_loc);
}
break;
case RID_AT_ENCODE:
@@ -7860,11 +7867,13 @@ c_parser_postfix_expression (c_parser *parser)
c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
break;
}
- c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
- "expected %<)%>");
{
+ location_t close_loc = c_parser_peek_token (parser)->location;
+ c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
+ "expected %<)%>");
tree type = groktypename (t1, NULL, NULL);
expr.value = objc_build_encode_expr (type);
+ set_c_expr_source_range (&expr, loc, close_loc);
}
break;
case RID_GENERIC:
@@ -7907,9 +7916,11 @@ c_parser_postfix_expression (c_parser *parser)
c_parser_consume_token (parser);
receiver = c_parser_objc_receiver (parser);
args = c_parser_objc_message_args (parser);
+ location_t close_loc = c_parser_peek_token (parser)->location;
c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE,
"expected %<]%>");
expr.value = objc_build_message_expr (receiver, args);
+ set_c_expr_source_range (&expr, loc, close_loc);
break;
}
/* Else fall through to report error. */