Skip to content

Commit a835405

Browse files
committed
C front-end: clean up use of ID_designated_initializer
The parser unnecessarily introduced an ID_designated_initializer into offsetof when no id was required, thereby creating an expression with ID_designated_initializer that had a different shape from all other uses of ID_designated_initializer. With this cleaned up, enable expr2c to print designated-initializer expressions.
1 parent 7e02b53 commit a835405

File tree

2 files changed

+32
-7
lines changed

2 files changed

+32
-7
lines changed

src/ansi-c/expr2c.cpp

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2280,10 +2280,36 @@ std::string expr2ct::convert_designated_initializer(const exprt &src)
22802280
return convert_norep(src, precedence);
22812281
}
22822282

2283-
std::string dest=".";
2284-
// TODO it->find(ID_member)
2283+
const exprt &value = to_unary_expr(src).op();
2284+
2285+
const exprt &designator = static_cast<const exprt &>(src.find(ID_designator));
2286+
if(designator.operands().size() != 1)
2287+
{
2288+
unsigned precedence;
2289+
return convert_norep(src, precedence);
2290+
}
2291+
2292+
const exprt &designator_id = to_unary_expr(designator).op();
2293+
2294+
std::string dest;
2295+
2296+
if(designator_id.id() == ID_member)
2297+
{
2298+
dest = "." + id2string(designator_id.get(ID_component_name));
2299+
}
2300+
else if(
2301+
designator_id.id() == ID_index && designator_id.operands().size() == 1)
2302+
{
2303+
dest = "[" + convert(to_unary_expr(designator_id).op()) + "]";
2304+
}
2305+
else
2306+
{
2307+
unsigned precedence;
2308+
return convert_norep(src, precedence);
2309+
}
2310+
22852311
dest+='=';
2286-
dest += convert(to_unary_expr(src).op());
2312+
dest += convert(value);
22872313

22882314
return dest;
22892315
}

src/ansi-c/parser.y

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -439,12 +439,11 @@ offsetof:
439439
offsetof_member_designator:
440440
member_name
441441
{
442-
init($$, ID_designated_initializer);
443-
parser_stack($$).operands().resize(1);
444-
auto &op = to_unary_expr(parser_stack($$)).op();
445-
op.id(ID_member);
442+
init($$);
443+
exprt op{ID_member};
446444
op.add_source_location()=parser_stack($1).source_location();
447445
op.set(ID_component_name, parser_stack($1).get(ID_C_base_name));
446+
parser_stack($$).add_to_operands(std::move(op));
448447
}
449448
| offsetof_member_designator '.' member_name
450449
{

0 commit comments

Comments
 (0)