diff options
| author | Andrew Kelley <superjoe30@gmail.com> | 2016-05-13 09:23:03 -0700 |
|---|---|---|
| committer | Andrew Kelley <superjoe30@gmail.com> | 2016-05-13 09:54:56 -0700 |
| commit | 8e3ab28be95de4faca64d5abab21f1948f71510b (patch) | |
| tree | e7a1a0c73840e846d19260d412601cb93c608775 /src/analyze.cpp | |
| parent | 774ec1f88992667529a7b3c149b59b68eb4f2c59 (diff) | |
| download | zig-8e3ab28be95de4faca64d5abab21f1948f71510b.tar.gz zig-8e3ab28be95de4faca64d5abab21f1948f71510b.zip | |
ability to cast maybe pointer to isize/usize
also ability to put noalias on maybe pointer
Diffstat (limited to 'src/analyze.cpp')
| -rw-r--r-- | src/analyze.cpp | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/src/analyze.cpp b/src/analyze.cpp index 5eb1be4381..aa8fe0d060 100644 --- a/src/analyze.cpp +++ b/src/analyze.cpp @@ -4168,6 +4168,16 @@ static TypeTableEntry *resolve_cast(CodeGen *g, BlockContext *context, AstNode * return wanted_type; } +static bool type_is_codegen_pointer(TypeTableEntry *type) { + if (type->id == TypeTableEntryIdPointer) return true; + if (type->id == TypeTableEntryIdFn) return true; + if (type->id == TypeTableEntryIdMaybe) { + if (type->data.maybe.child_type->id == TypeTableEntryIdPointer) return true; + if (type->data.maybe.child_type->id == TypeTableEntryIdFn) return true; + } + return false; +} + static TypeTableEntry *analyze_cast_expr(CodeGen *g, ImportTableEntry *import, BlockContext *context, AstNode *node) { @@ -4207,7 +4217,7 @@ static TypeTableEntry *analyze_cast_expr(CodeGen *g, ImportTableEntry *import, B // explicit cast from pointer to isize or usize if ((wanted_type_canon == g->builtin_types.entry_isize || wanted_type_canon == g->builtin_types.entry_usize) && - actual_type_canon->id == TypeTableEntryIdPointer) + type_is_codegen_pointer(actual_type_canon)) { return resolve_cast(g, context, node, expr_node, wanted_type, CastOpPtrToInt, false); } @@ -6193,9 +6203,8 @@ static void analyze_fn_body(CodeGen *g, FnTableEntry *fn_table_entry) { AstNodeParamDecl *param_decl = ¶m_decl_node->data.param_decl; TypeTableEntry *type = unwrapped_node_type(param_decl->type); - if (param_decl->is_noalias && type->id != TypeTableEntryIdPointer) { - add_node_error(g, param_decl_node, - buf_sprintf("noalias on non-pointer parameter")); + if (param_decl->is_noalias && !type_is_codegen_pointer(type)) { + add_node_error(g, param_decl_node, buf_sprintf("noalias on non-pointer parameter")); } if (fn_type->data.fn.fn_type_id.is_extern && type->id == TypeTableEntryIdStruct) { |
