Fix header generation for unsafe externals
M src/backends/LLVMModule.cpp +5 -4
@@ 338,23 338,24 @@ namespace K3 {
 					auto slotI = globalSymbolTable.find(gv.second.uid);
 					auto slotIndex = slotI != globalSymbolTable.end() ? std::int32_t(slotI->second) : -1;
 
-					bool noDefaultVal =
+					bool constructorParameter =
 						((gv.second.varType == External || 
 						  gv.second.varType == Configuration) 
 						 && globalKeyTable.find(gv.first) != globalKeyTable.end());
-
+                    
 					if (slotIndex >= 0) {
 						std::stringstream driverName;
 						if (gv.second.varType == Stream) {
 							gv.second.clock.OutputText(driverName);
 						}
-						cppHeader.DeclareSlot(sym.str(), slotIndex, gv.second.data, noDefaultVal, driverName.str());
+						cppHeader.DeclareSlot(sym.str(), slotIndex, gv.second.data, constructorParameter, driverName.str());
 					}
 							
 					if (trigger != inputCall.end()) {
 						cppHeader.DeclareDriver(trigger->second->getName());
 					}
-
+                    
+                    bool noDefaultVal = constructorParameter || gv.second.varType == UnsafeExternal;
 				
 					symTableEntry.emplace_back(
 						ConstantStruct::get(symTy, {

          
M src/backends/LLVMModule.h +3 -3
@@ 149,7 149,7 @@ namespace K3 {
 						<< wrapperName << "(" << wrapperName << " const&) = delete;\n\t"
 						<< wrapperName << "(" << wrapperName << "&& from) { instance = from.instance; from.instance = nullptr; };\n\t"
 						<< "void operator=(" << wrapperName << " const&) = delete;\n\t"
-						<< wrapperName << "& operator=(" << wrapperName << "&& from) { auto tmp = from.instance; from.instance = instance; instance = tmp; }\n"
+						<< wrapperName << "& operator=(" << wrapperName << "&& from) { auto tmp = from.instance; from.instance = instance; instance = tmp; return *this; }\n"
 						// << "#endif\n"
 						"\n";
 

          
@@ 236,12 236,12 @@ namespace K3 {
 
 			std::vector<ConfigValue> configSlots;
 
-			void DeclareSlot(std::string slotName, int slotIndex, const Type& inputType, bool nodefault, std::string streamingDriver) {
+			void DeclareSlot(std::string slotName, int slotIndex, const Type& inputType, bool constructorParameter, std::string streamingDriver) {
 				if (header.is_open()) {
 					auto typeName = GenerateType(className + slotName + "InputType", inputType);
 					auto cName = CSymbolize(slotName);
 
-					if (nodefault) {
+					if (constructorParameter) {
 						header << "\n// You must set this before calling `" << className << "Initialize()`\n";
 						configSlots.push_back(ConfigValue{ typeName, cName });
 						header << "static void " << className << "Configure" << cName << "(const " << typeName << "* data) { \n\t"

          
M src/k3/DynamicVariables.cpp +2 -2
@@ 47,8 47,8 @@ namespace K3 {
                                          key.result.Fix(),
                                          std::make_pair(1,1),
                                          nullptr,
-                                         External),
-                                      initType);                                      
+                                         UnsafeExternal),
+                                      initType);
             }
 
 			if (spec.mode == SpecializationState::Configuration) {

          
M src/k3/DynamicVariables.h +1 -0
@@ 23,6 23,7 @@ namespace K3 {
 				Internal,
 				External,
 				Stream,
+                UnsafeExternal,
 				NumVarTypes
 			};