Add *FreeMembers functions for out structs with non-value members

The function is called automatically in the dtor of the C++ structs.
The C++ structs are also made non-copyable to prevent a double-free.

Bug: dawn:1959
Change-Id: Idfebdc1ea144d69543de8ed7671657a0617e3b82
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/141501
Kokoro: Kokoro <noreply+kokoro@google.com>
Reviewed-by: Loko Kung <lokokung@google.com>
Commit-Queue: Austin Eng <enga@chromium.org>
diff --git a/generator/templates/mock_api.cpp b/generator/templates/mock_api.cpp
index bf8f871..91bcfce 100644
--- a/generator/templates/mock_api.cpp
+++ b/generator/templates/mock_api.cpp
@@ -13,6 +13,7 @@
 //* limitations under the License.
 
 {% set api = metadata.api.lower() %}
+#include "dawn/common/Log.h"
 #include "mock_{{api}}.h"
 
 using namespace testing;
@@ -48,6 +49,12 @@
             table->{{as_varName(type.name, method.name)}} = reinterpret_cast<{{as_cProc(type.name, method.name)}}>(Forward{{as_MethodSuffix(type.name, method.name)}});
         {% endfor %}
     {% endfor %}
+
+    {% for type in by_category["structure"] if type.has_free_members_function %}
+        table->{{as_varName(type.name, Name("free members"))}} = []({{as_cType(type.name)}} {{as_varName(type.name)}}) {
+            dawn::WarningLog() << "No mock available for {{as_varName(type.name, Name('free members'))}}";
+        };
+    {% endfor %}
 }
 
 {% for type in by_category["object"] %}