translate-c: Correctly translate enum init values, addressing #1360

This commit is contained in:
Michael Noronha 2018-08-12 17:41:43 -07:00 committed by Andrew Kelley
parent dd4b13ac03
commit 7e7e59d881
2 changed files with 36 additions and 2 deletions

View File

@ -458,9 +458,17 @@ static const char *decl_name(const Decl *decl) {
static AstNode *trans_create_node_apint(Context *c, const llvm::APSInt &aps_int) {
AstNode *node = trans_create_node(c, NodeTypeIntLiteral);
node->data.int_literal.bigint = allocate<BigInt>(1);
bigint_init_data(node->data.int_literal.bigint, aps_int.getRawData(), aps_int.getNumWords(), aps_int.isNegative());
return node;
llvm::APSInt copy = aps_int;
llvm::APSInt positive = (~copy)++;
if (!aps_int.isNegative()) {
bigint_init_data(node->data.int_literal.bigint, aps_int.getRawData(), aps_int.getNumWords(), aps_int.isNegative());
} else {
bigint_init_data(node->data.int_literal.bigint, positive.getRawData(), positive.getNumWords(), aps_int.isNegative());
}
return node;
}
static const Type *qual_type_canon(QualType qt) {

View File

@ -1358,4 +1358,30 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
\\ }
\\}
);
cases.add("correctly translate enum init values",
\\enum EnumWithInits {
\\ VAL1 = 0,
\\ VAL2 = 1,
\\ VAL3 = 2,
\\ VAL4 = 3,
\\ VAL5 = -1,
\\ VAL6 = -2,
\\ VAL7 = -3,
\\ VAL8 = -4,
\\ VAL9 = VAL2 + VAL8,
\\};
,
\\pub const enum_EnumWithInits = extern enum {
\\ VAL1 = 0,
\\ VAL2 = 1,
\\ VAL3 = 2,
\\ VAL4 = 3,
\\ VAL5 = -1,
\\ VAL6 = -2,
\\ VAL7 = -3,
\\ VAL8 = -4,
\\ VAL9 = -3,
\\};
);
}