aboutsummaryrefslogtreecommitdiff
path: root/src/analyze.cpp
diff options
context:
space:
mode:
authorAndrew Kelley <superjoe30@gmail.com>2016-05-13 09:23:03 -0700
committerAndrew Kelley <superjoe30@gmail.com>2016-05-13 09:54:56 -0700
commit8e3ab28be95de4faca64d5abab21f1948f71510b (patch)
treee7a1a0c73840e846d19260d412601cb93c608775 /src/analyze.cpp
parent774ec1f88992667529a7b3c149b59b68eb4f2c59 (diff)
downloadzig-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.cpp17
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 = &param_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) {