| ... | @@ -479,7 +479,7 @@ static const char *decl_name(const Decl *decl) { | ... | @@ -479,7 +479,7 @@ static const char *decl_name(const Decl *decl) { |
| 479 | static AstNode *trans_create_node_apint(Context *c, const llvm::APSInt &aps_int) { | 479 | static AstNode *trans_create_node_apint(Context *c, const llvm::APSInt &aps_int) { |
| 480 | AstNode *node = trans_create_node(c, NodeTypeIntLiteral); | 480 | AstNode *node = trans_create_node(c, NodeTypeIntLiteral); |
| 481 | node->data.int_literal.bigint = allocate<BigInt>(1); | 481 | node->data.int_literal.bigint = allocate<BigInt>(1); |
| 482 | bool is_negative = aps_int.isNegative(); | 482 | bool is_negative = aps_int.isSigned() && aps_int.isNegative(); |
| 483 | if (!is_negative) { | 483 | if (!is_negative) { |
| 484 | bigint_init_data(node->data.int_literal.bigint, aps_int.getRawData(), aps_int.getNumWords(), false); | 484 | bigint_init_data(node->data.int_literal.bigint, aps_int.getRawData(), aps_int.getNumWords(), false); |
| 485 | return node; | 485 | return node; |
| ... | @@ -4092,10 +4092,13 @@ static AstNode *trans_ap_value(Context *c, APValue *ap_value, QualType qt, const | ... | @@ -4092,10 +4092,13 @@ static AstNode *trans_ap_value(Context *c, APValue *ap_value, QualType qt, const |
| 4092 | unsigned leftover_count = all_count - init_count; | 4092 | unsigned leftover_count = all_count - init_count; |
| 4093 | AstNode *init_node = trans_create_node(c, NodeTypeContainerInitExpr); | 4093 | AstNode *init_node = trans_create_node(c, NodeTypeContainerInitExpr); |
| 4094 | AstNode *arr_type_node = trans_qual_type(c, qt, source_loc); | 4094 | AstNode *arr_type_node = trans_qual_type(c, qt, source_loc); |
| | 4095 | if (leftover_count != 0) { // We can't use the size of the final array for a partial initializer. |
| | 4096 | bigint_init_unsigned(arr_type_node->data.array_type.size->data.int_literal.bigint, init_count); |
| | 4097 | } |
| 4095 | init_node->data.container_init_expr.type = arr_type_node; | 4098 | init_node->data.container_init_expr.type = arr_type_node; |
| 4096 | init_node->data.container_init_expr.kind = ContainerInitKindArray; | 4099 | init_node->data.container_init_expr.kind = ContainerInitKindArray; |
| 4097 | | 4100 | |
| 4098 | QualType child_qt = qt.getTypePtr()->getLocallyUnqualifiedSingleStepDesugaredType(); | 4101 | QualType child_qt = qt.getTypePtr()->getAsArrayTypeUnsafe()->getElementType(); |
| 4099 | | 4102 | |
| 4100 | for (size_t i = 0; i < init_count; i += 1) { | 4103 | for (size_t i = 0; i < init_count; i += 1) { |
| 4101 | APValue &elem_ap_val = ap_value->getArrayInitializedElt(i); | 4104 | APValue &elem_ap_val = ap_value->getArrayInitializedElt(i); |
| ... | @@ -4113,10 +4116,14 @@ static AstNode *trans_ap_value(Context *c, APValue *ap_value, QualType qt, const | ... | @@ -4113,10 +4116,14 @@ static AstNode *trans_ap_value(Context *c, APValue *ap_value, QualType qt, const |
| 4113 | if (filler_node == nullptr) | 4116 | if (filler_node == nullptr) |
| 4114 | return nullptr; | 4117 | return nullptr; |
| 4115 | | 4118 | |
| | 4119 | AstNode* filler_arr_type = trans_create_node(c, NodeTypeArrayType); |
| | 4120 | *filler_arr_type = *arr_type_node; |
| | 4121 | filler_arr_type->data.array_type.size = trans_create_node_unsigned(c, 1); |
| | 4122 | |
| 4116 | AstNode *filler_arr_1 = trans_create_node(c, NodeTypeContainerInitExpr); | 4123 | AstNode *filler_arr_1 = trans_create_node(c, NodeTypeContainerInitExpr); |
| 4117 | init_node->data.container_init_expr.type = arr_type_node; | 4124 | filler_arr_1->data.container_init_expr.type = filler_arr_type; |
| 4118 | init_node->data.container_init_expr.kind = ContainerInitKindArray; | 4125 | filler_arr_1->data.container_init_expr.kind = ContainerInitKindArray; |
| 4119 | init_node->data.container_init_expr.entries.append(filler_node); | 4126 | filler_arr_1->data.container_init_expr.entries.append(filler_node); |
| 4120 | | 4127 | |
| 4121 | AstNode *rhs_node; | 4128 | AstNode *rhs_node; |
| 4122 | if (leftover_count == 1) { | 4129 | if (leftover_count == 1) { |
| ... | @@ -4126,6 +4133,10 @@ static AstNode *trans_ap_value(Context *c, APValue *ap_value, QualType qt, const | ... | @@ -4126,6 +4133,10 @@ static AstNode *trans_ap_value(Context *c, APValue *ap_value, QualType qt, const |
| 4126 | rhs_node = trans_create_node_bin_op(c, filler_arr_1, BinOpTypeArrayMult, amt_node); | 4133 | rhs_node = trans_create_node_bin_op(c, filler_arr_1, BinOpTypeArrayMult, amt_node); |
| 4127 | } | 4134 | } |
| 4128 | | 4135 | |
| | 4136 | if (init_count == 0) { |
| | 4137 | return rhs_node; |
| | 4138 | } |
| | 4139 | |
| 4129 | return trans_create_node_bin_op(c, init_node, BinOpTypeArrayCat, rhs_node); | 4140 | return trans_create_node_bin_op(c, init_node, BinOpTypeArrayCat, rhs_node); |
| 4130 | } | 4141 | } |
| 4131 | case APValue::LValue: { | 4142 | case APValue::LValue: { |