diff --git a/src/c-writer.cc b/src/c-writer.cc index 4ab14ddb0..93c469e3e 100644 --- a/src/c-writer.cc +++ b/src/c-writer.cc @@ -378,7 +378,7 @@ class CWriter { void Write(const FuncTypeExpr&); void WriteTagDecls(); void WriteTags(); - void ComputeUniqueImports(); + Result ComputeUniqueImports(); void BeginInstance(); void WriteImports(); void WriteTailCallWeakImports(); @@ -1810,7 +1810,7 @@ void CWriter::WriteTags() { } } -void CWriter::ComputeUniqueImports() { +Result CWriter::ComputeUniqueImports() { using modname_name_pair = std::pair; std::map import_map; for (const Import* import : module_->imports) { @@ -1821,7 +1821,13 @@ void CWriter::ComputeUniqueImports() { modname_name_pair(import->module_name, import->field_name), import); if (!iterator_and_insertion_bool.second) { if (iterator_and_insertion_bool.first->second->kind() != import->kind()) { - UNIMPLEMENTED("contradictory import declaration"); + fprintf(stderr, + "error: contradictory import declaration: \"%s\".\"%s\" is " + "imported as both a %s and a %s\n", + import->module_name.c_str(), import->field_name.c_str(), + GetKindName(iterator_and_insertion_bool.first->second->kind()), + GetKindName(import->kind())); + return Result::Error; } else { fprintf(stderr, "warning: duplicate import declaration \"%s\" \"%s\"\n", import->module_name.c_str(), import->field_name.c_str()); @@ -1838,6 +1844,7 @@ void CWriter::ComputeUniqueImports() { for (const auto& node : import_map) { unique_imports_.push_back(node.second); } + return Result::Ok; } void CWriter::BeginInstance() { @@ -1846,7 +1853,10 @@ void CWriter::BeginInstance() { return; } - ComputeUniqueImports(); + if (Failed(ComputeUniqueImports())) { + result_ = Result::Error; + return; + } // define names of per-instance imports for (const Import* import : module_->imports) { @@ -2119,6 +2129,9 @@ void CWriter::WriteV128Decl() { void CWriter::WriteModuleInstance() { BeginInstance(); + if (Failed(result_)) { + return; + } WriteGlobals(); WriteMemories(); WriteTables(); @@ -6131,6 +6144,9 @@ void CWriter::WriteCHeader() { Write(s_header_top); Write(Newline()); WriteModuleInstance(); + if (Failed(result_)) { + return; + } WriteInitDecl(); WriteFreeDecl(); WriteGetFuncTypeDecl(); @@ -6193,7 +6209,11 @@ void CWriter::WriteCSource() { Result CWriter::WriteModule(const Module& module) { WABT_USE(options_); module_ = &module; + WriteCHeader(); + if (Failed(result_)) { + return result_; + } WriteCSource(); return result_; } diff --git a/test/wasm2c/contradictory-imports.txt b/test/wasm2c/contradictory-imports.txt new file mode 100644 index 000000000..3fd520fa0 --- /dev/null +++ b/test/wasm2c/contradictory-imports.txt @@ -0,0 +1,9 @@ +;;; RUN: %(wat2wasm)s %(in_file)s -o %(temp_file)s.wasm +;;; RUN: %(wasm2c)s %(temp_file)s.wasm -o %(temp_file)s.c +;;; ERROR: 1 +(module + (import "e" "x" (func)) + (import "e" "x" (global i32))) +(;; STDERR ;;; +error: contradictory import declaration: "e"."x" is imported as both a func and a global +;;; STDERR ;;)