mirror of
https://github.com/odin-lang/Odin.git
synced 2026-01-03 03:32:37 +00:00
Merge remote-tracking branch 'upstream/master'
This commit is contained in:
@@ -387,10 +387,11 @@ gb_internal Ast *clone_ast(Ast *node, AstFile *f) {
|
||||
n->DynamicArrayType.elem = clone_ast(n->DynamicArrayType.elem, f);
|
||||
break;
|
||||
case Ast_StructType:
|
||||
n->StructType.fields = clone_ast_array(n->StructType.fields, f);
|
||||
n->StructType.fields = clone_ast_array(n->StructType.fields, f);
|
||||
n->StructType.polymorphic_params = clone_ast(n->StructType.polymorphic_params, f);
|
||||
n->StructType.align = clone_ast(n->StructType.align, f);
|
||||
n->StructType.where_clauses = clone_ast_array(n->StructType.where_clauses, f);
|
||||
n->StructType.align = clone_ast(n->StructType.align, f);
|
||||
n->StructType.field_align = clone_ast(n->StructType.field_align, f);
|
||||
n->StructType.where_clauses = clone_ast_array(n->StructType.where_clauses, f);
|
||||
break;
|
||||
case Ast_UnionType:
|
||||
n->UnionType.variants = clone_ast_array(n->UnionType.variants, f);
|
||||
@@ -1129,7 +1130,7 @@ gb_internal Ast *ast_dynamic_array_type(AstFile *f, Token token, Ast *elem) {
|
||||
|
||||
gb_internal Ast *ast_struct_type(AstFile *f, Token token, Slice<Ast *> fields, isize field_count,
|
||||
Ast *polymorphic_params, bool is_packed, bool is_raw_union, bool is_no_copy,
|
||||
Ast *align,
|
||||
Ast *align, Ast *field_align,
|
||||
Token where_token, Array<Ast *> const &where_clauses) {
|
||||
Ast *result = alloc_ast_node(f, Ast_StructType);
|
||||
result->StructType.token = token;
|
||||
@@ -1140,6 +1141,7 @@ gb_internal Ast *ast_struct_type(AstFile *f, Token token, Slice<Ast *> fields, i
|
||||
result->StructType.is_raw_union = is_raw_union;
|
||||
result->StructType.is_no_copy = is_no_copy;
|
||||
result->StructType.align = align;
|
||||
result->StructType.field_align = field_align;
|
||||
result->StructType.where_token = where_token;
|
||||
result->StructType.where_clauses = slice_from_array(where_clauses);
|
||||
return result;
|
||||
@@ -2511,6 +2513,7 @@ gb_internal Ast *parse_operand(AstFile *f, bool lhs) {
|
||||
bool is_raw_union = false;
|
||||
bool no_copy = false;
|
||||
Ast *align = nullptr;
|
||||
Ast *field_align = nullptr;
|
||||
|
||||
if (allow_token(f, Token_OpenParen)) {
|
||||
isize param_count = 0;
|
||||
@@ -2547,6 +2550,18 @@ gb_internal Ast *parse_operand(AstFile *f, bool lhs) {
|
||||
error_line("\tSuggestion: #align(%s)", s);
|
||||
gb_string_free(s);
|
||||
}
|
||||
} else if (tag.string == "field_align") {
|
||||
if (field_align) {
|
||||
syntax_error(tag, "Duplicate struct tag '#%.*s'", LIT(tag.string));
|
||||
}
|
||||
field_align = parse_expr(f, true);
|
||||
if (field_align && field_align->kind != Ast_ParenExpr) {
|
||||
ERROR_BLOCK();
|
||||
gbString s = expr_to_string(field_align);
|
||||
syntax_warning(tag, "#field_align requires parentheses around the expression");
|
||||
error_line("\tSuggestion: #field_align(%s)", s);
|
||||
gb_string_free(s);
|
||||
}
|
||||
} else if (tag.string == "raw_union") {
|
||||
if (is_raw_union) {
|
||||
syntax_error(tag, "Duplicate struct tag '#%.*s'", LIT(tag.string));
|
||||
@@ -2595,7 +2610,7 @@ gb_internal Ast *parse_operand(AstFile *f, bool lhs) {
|
||||
decls = fields->FieldList.list;
|
||||
}
|
||||
|
||||
return ast_struct_type(f, token, decls, name_count, polymorphic_params, is_packed, is_raw_union, no_copy, align, where_token, where_clauses);
|
||||
return ast_struct_type(f, token, decls, name_count, polymorphic_params, is_packed, is_raw_union, no_copy, align, field_align, where_token, where_clauses);
|
||||
} break;
|
||||
|
||||
case Token_union: {
|
||||
@@ -5449,6 +5464,11 @@ gb_internal bool determine_path_from_string(BlockingMutex *file_mutex, Ast *node
|
||||
|
||||
|
||||
if (collection_name.len > 0) {
|
||||
// NOTE(bill): `base:runtime` == `core:runtime`
|
||||
if (collection_name == "core" && string_starts_with(file_str, str_lit("runtime"))) {
|
||||
collection_name = str_lit("base");
|
||||
}
|
||||
|
||||
if (collection_name == "system") {
|
||||
if (node->kind != Ast_ForeignImportDecl) {
|
||||
syntax_error(node, "The library collection 'system' is restrict for 'foreign_library'");
|
||||
@@ -5478,13 +5498,12 @@ gb_internal bool determine_path_from_string(BlockingMutex *file_mutex, Ast *node
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
if (is_package_name_reserved(file_str)) {
|
||||
*path = file_str;
|
||||
if (collection_name == "core") {
|
||||
if (collection_name == "core" || collection_name == "base") {
|
||||
return true;
|
||||
} else {
|
||||
syntax_error(node, "The package '%.*s' must be imported with the core library collection: 'core:%.*s'", LIT(file_str), LIT(file_str));
|
||||
syntax_error(node, "The package '%.*s' must be imported with the 'base' library collection: 'base:%.*s'", LIT(file_str), LIT(file_str));
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -6122,7 +6141,7 @@ gb_internal ParseFileError parse_packages(Parser *p, String init_filename) {
|
||||
{ // Add these packages serially and then process them parallel
|
||||
TokenPos init_pos = {};
|
||||
{
|
||||
String s = get_fullpath_core(permanent_allocator(), str_lit("runtime"));
|
||||
String s = get_fullpath_base_collection(permanent_allocator(), str_lit("runtime"));
|
||||
try_add_import_path(p, s, s, init_pos, Package_Runtime);
|
||||
}
|
||||
|
||||
@@ -6130,7 +6149,7 @@ gb_internal ParseFileError parse_packages(Parser *p, String init_filename) {
|
||||
p->init_fullpath = init_fullpath;
|
||||
|
||||
if (build_context.command_kind == Command_test) {
|
||||
String s = get_fullpath_core(permanent_allocator(), str_lit("testing"));
|
||||
String s = get_fullpath_core_collection(permanent_allocator(), str_lit("testing"));
|
||||
try_add_import_path(p, s, s, init_pos, Package_Normal);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user