aboutsummaryrefslogtreecommitdiff
path: root/src/ir.cpp
diff options
context:
space:
mode:
authorAndrew Kelley <superjoe30@gmail.com>2017-11-03 00:00:57 -0400
committerAndrew Kelley <superjoe30@gmail.com>2017-11-03 00:00:57 -0400
commita31b23c46ba2a8c28df01adc1aa0b4d878b9a5cf (patch)
treeb9f978f1c930a4c251e876ea850b380de13bfa4b /src/ir.cpp
parentdc8b011d616991da166ad83795bf0b7e90471bd3 (diff)
downloadzig-a31b23c46ba2a8c28df01adc1aa0b4d878b9a5cf.tar.gz
zig-a31b23c46ba2a8c28df01adc1aa0b4d878b9a5cf.zip
more compile-time type reflection
See #383
Diffstat (limited to 'src/ir.cpp')
-rw-r--r--src/ir.cpp49
1 files changed, 49 insertions, 0 deletions
diff --git a/src/ir.cpp b/src/ir.cpp
index 6c6ce676f6..e2e61fed7d 100644
--- a/src/ir.cpp
+++ b/src/ir.cpp
@@ -11643,6 +11643,55 @@ static TypeTableEntry *ir_analyze_instruction_field_ptr(IrAnalyze *ira, IrInstru
buf_ptr(&child_type->name), buf_ptr(field_name)));
return ira->codegen->builtin_types.entry_invalid;
}
+ } else if (child_type->id == TypeTableEntryIdErrorUnion) {
+ if (buf_eql_str(field_name, "Child")) {
+ bool ptr_is_const = true;
+ bool ptr_is_volatile = false;
+ return ir_analyze_const_ptr(ira, &field_ptr_instruction->base,
+ create_const_type(ira->codegen, child_type->data.error.child_type),
+ ira->codegen->builtin_types.entry_type,
+ ConstPtrMutComptimeConst, ptr_is_const, ptr_is_volatile);
+ } else {
+ ir_add_error(ira, &field_ptr_instruction->base,
+ buf_sprintf("type '%s' has no member called '%s'",
+ buf_ptr(&child_type->name), buf_ptr(field_name)));
+ return ira->codegen->builtin_types.entry_invalid;
+ }
+ } else if (child_type->id == TypeTableEntryIdMaybe) {
+ if (buf_eql_str(field_name, "Child")) {
+ bool ptr_is_const = true;
+ bool ptr_is_volatile = false;
+ return ir_analyze_const_ptr(ira, &field_ptr_instruction->base,
+ create_const_type(ira->codegen, child_type->data.maybe.child_type),
+ ira->codegen->builtin_types.entry_type,
+ ConstPtrMutComptimeConst, ptr_is_const, ptr_is_volatile);
+ } else {
+ ir_add_error(ira, &field_ptr_instruction->base,
+ buf_sprintf("type '%s' has no member called '%s'",
+ buf_ptr(&child_type->name), buf_ptr(field_name)));
+ return ira->codegen->builtin_types.entry_invalid;
+ }
+ } else if (child_type->id == TypeTableEntryIdFn) {
+ if (buf_eql_str(field_name, "ReturnType")) {
+ bool ptr_is_const = true;
+ bool ptr_is_volatile = false;
+ return ir_analyze_const_ptr(ira, &field_ptr_instruction->base,
+ create_const_type(ira->codegen, child_type->data.fn.fn_type_id.return_type),
+ ira->codegen->builtin_types.entry_type,
+ ConstPtrMutComptimeConst, ptr_is_const, ptr_is_volatile);
+ } else if (buf_eql_str(field_name, "is_var_args")) {
+ bool ptr_is_const = true;
+ bool ptr_is_volatile = false;
+ return ir_analyze_const_ptr(ira, &field_ptr_instruction->base,
+ create_const_bool(ira->codegen, child_type->data.fn.fn_type_id.is_var_args),
+ ira->codegen->builtin_types.entry_bool,
+ ConstPtrMutComptimeConst, ptr_is_const, ptr_is_volatile);
+ } else {
+ ir_add_error(ira, &field_ptr_instruction->base,
+ buf_sprintf("type '%s' has no member called '%s'",
+ buf_ptr(&child_type->name), buf_ptr(field_name)));
+ return ira->codegen->builtin_types.entry_invalid;
+ }
} else {
ir_add_error(ira, &field_ptr_instruction->base,
buf_sprintf("type '%s' does not support field access", buf_ptr(&child_type->name)));