aboutsummaryrefslogtreecommitdiff
path: root/src/analyze.cpp
diff options
context:
space:
mode:
authorAndrew Kelley <superjoe30@gmail.com>2018-03-12 12:56:25 -0400
committerAndrew Kelley <superjoe30@gmail.com>2018-03-12 12:56:25 -0400
commitbcce77700fe0967b4dd796a3a21605868b6f9aa2 (patch)
treeb3a062d4a1e3ed2e2cf103af89510670a783dd87 /src/analyze.cpp
parent5834ff0cc58ffba8e4fe218fcf888d9f9fcf95b2 (diff)
downloadzig-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.cpp46
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;