diff options
| author | Andrew Kelley <superjoe30@gmail.com> | 2018-03-12 12:56:25 -0400 |
|---|---|---|
| committer | Andrew Kelley <superjoe30@gmail.com> | 2018-03-12 12:56:25 -0400 |
| commit | bcce77700fe0967b4dd796a3a21605868b6f9aa2 (patch) | |
| tree | b3a062d4a1e3ed2e2cf103af89510670a783dd87 /src/analyze.cpp | |
| parent | 5834ff0cc58ffba8e4fe218fcf888d9f9fcf95b2 (diff) | |
| download | zig-bcce77700fe0967b4dd796a3a21605868b6f9aa2.tar.gz zig-bcce77700fe0967b4dd796a3a21605868b6f9aa2.zip | |
some return types disqualify comptime fn call caching
closes #828
Diffstat (limited to 'src/analyze.cpp')
| -rw-r--r-- | src/analyze.cpp | 46 |
1 files changed, 45 insertions, 1 deletions
diff --git a/src/analyze.cpp b/src/analyze.cpp index c7ba8ccc74..aaf7c08bd8 100644 --- a/src/analyze.cpp +++ b/src/analyze.cpp @@ -4631,7 +4631,51 @@ static bool can_mutate_comptime_var_state(ConstExprValue *value) { zig_unreachable(); } -bool fn_eval_cacheable(Scope *scope) { +static bool return_type_is_cacheable(TypeTableEntry *return_type) { + switch (return_type->id) { + case TypeTableEntryIdInvalid: + zig_unreachable(); + case TypeTableEntryIdMetaType: + case TypeTableEntryIdVoid: + case TypeTableEntryIdBool: + case TypeTableEntryIdUnreachable: + case TypeTableEntryIdInt: + case TypeTableEntryIdFloat: + case TypeTableEntryIdNumLitFloat: + case TypeTableEntryIdNumLitInt: + case TypeTableEntryIdUndefLit: + case TypeTableEntryIdNullLit: + case TypeTableEntryIdNamespace: + case TypeTableEntryIdBoundFn: + case TypeTableEntryIdFn: + case TypeTableEntryIdBlock: + case TypeTableEntryIdOpaque: + case TypeTableEntryIdPromise: + case TypeTableEntryIdErrorSet: + case TypeTableEntryIdEnum: + case TypeTableEntryIdPointer: + return true; + + case TypeTableEntryIdArray: + case TypeTableEntryIdStruct: + case TypeTableEntryIdUnion: + return false; + + case TypeTableEntryIdMaybe: + return return_type_is_cacheable(return_type->data.maybe.child_type); + + case TypeTableEntryIdErrorUnion: + return return_type_is_cacheable(return_type->data.error_union.payload_type); + + case TypeTableEntryIdArgTuple: + zig_panic("TODO var args at comptime is currently not supported"); + } + zig_unreachable(); +} + +bool fn_eval_cacheable(Scope *scope, TypeTableEntry *return_type) { + if (!return_type_is_cacheable(return_type)) + return false; while (scope) { if (scope->id == ScopeIdVarDecl) { ScopeVarDecl *var_scope = (ScopeVarDecl *)scope; |
