summaryrefslogtreecommitdiff
path: root/source/slang/slang-ast-builder.h
diff options
context:
space:
mode:
authorEllie Hermaszewska <ellieh@nvidia.com>2023-05-12 04:33:21 +0800
committerGitHub <noreply@github.com>2023-05-11 13:33:21 -0700
commit332f60c19336252d907b83882aa70665ca93a9d2 (patch)
tree45a3aa3ba0aa999f1a6cea00e8fcb11f7dafd9b8 /source/slang/slang-ast-builder.h
parentf414a14c1eac050ff2e1bdaf4f3dd2e4ec6f644e (diff)
MVP for higher order functions (#2849)
* MVP for higher order functions * Add shader subgroup partitioned glsl intrinsics * Implement parsing and checking for tuple types Currently there is no way to do anything useful with them from the source language however * neaten * Correct precedence of function type parsing * neaten * higher order function tests * function types of any arity * Inference for higher order functions * Add second test for unsynchronized params * regenerate vs projects * dx11 -> dx12 for saturated cooperations tests * Disable saturated cooperation tests on vulkan They fail on release builds in CI, not essential for the higher order function work however * remove saturated-cooperation tests * Remove unnecessary assert and clarify control flow in AddDeclRefOverloadCandidates * Add Tuple type name mangling * Use functype keyword to introduce function types * Add more inference tests for hof --------- Co-authored-by: Yong He <yonghe@outlook.com>
Diffstat (limited to 'source/slang/slang-ast-builder.h')
-rw-r--r--source/slang/slang-ast-builder.h31
1 files changed, 27 insertions, 4 deletions
diff --git a/source/slang/slang-ast-builder.h b/source/slang/slang-ast-builder.h
index c39293914..1ef56894b 100644
--- a/source/slang/slang-ast-builder.h
+++ b/source/slang/slang-ast-builder.h
@@ -151,6 +151,25 @@ public:
/// no need for additional state.
Dictionary<NodeDesc, NodeBase*> m_cachedNodes;
+ template<int N>
+ static void addOrAppendToNodeList(ShortList<NodeOperand, N>&)
+ {}
+
+ template<int N, typename T, typename... Ts>
+ static void addOrAppendToNodeList(ShortList<NodeOperand, N>& list, T t, Ts... ts)
+ {
+ list.add(t);
+ addOrAppendToNodeList(list, ts...);
+ }
+
+ template<int N, typename T, typename... Ts>
+ static void addOrAppendToNodeList(ShortList<NodeOperand, N>& list, const List<T>& l, Ts... ts )
+ {
+ for(auto t : l)
+ list.add(t);
+ addOrAppendToNodeList(list, ts...);
+ }
+
public:
// For compile time check to see if thing being constructed is an AST type
@@ -174,11 +193,11 @@ public:
}
template<typename T, typename... TArgs>
- T* create(TArgs... args)
+ T* create(TArgs&&... args)
{
auto alloced = m_arena.allocate(sizeof(T));
memset(alloced, 0, sizeof(T));
- return _initAndAdd(new (alloced) T(args...));
+ return _initAndAdd(new (alloced) T(std::forward<TArgs>(args)...));
}
template<typename T, typename ... TArgs>
@@ -187,7 +206,7 @@ public:
SLANG_COMPILE_TIME_ASSERT(IsValidType<T>::Value);
NodeDesc desc;
desc.type = T::kType;
- addToList(desc.operands, args...);
+ addOrAppendToNodeList(desc.operands, args...);
return (T*)_getOrCreateImpl(desc, [&]()
{
return create<T>(args...);
@@ -210,7 +229,7 @@ public:
SLANG_COMPILE_TIME_ASSERT(IsValidType<T>::Value);
NodeDesc desc;
desc.type = T::kType;
- addToList(desc.operands, args...);
+ addOrAppendToNodeList(desc.operands, args...);
return (T*)_getOrCreateImpl(desc, [&]()
{
return create<T>();
@@ -367,6 +386,10 @@ public:
Val* getSNormModifierVal();
Val* getNoDiffModifierVal();
+ Type* getTupleType(List<Type*>& types);
+
+ Type* getFuncType(List<Type*> parameters, Type* result);
+
TypeType* getTypeType(Type* type);
/// Helpers to get type info from the SharedASTBuilder