Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 13 additions & 5 deletions src/c-writer.cc
Original file line number Diff line number Diff line change
Expand Up @@ -378,7 +378,7 @@ class CWriter {
void Write(const FuncTypeExpr&);
void WriteTagDecls();
void WriteTags();
void ComputeUniqueImports();
Result ComputeUniqueImports();
void BeginInstance();
void WriteImports();
void WriteTailCallWeakImports();
Expand Down Expand Up @@ -1794,7 +1794,7 @@ void CWriter::WriteTags() {
}
}

void CWriter::ComputeUniqueImports() {
Result CWriter::ComputeUniqueImports() {
using modname_name_pair = std::pair<std::string, std::string>;
std::map<modname_name_pair, const Import*> import_map;
for (const Import* import : module_->imports) {
Expand All @@ -1805,7 +1805,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());
Expand All @@ -1822,6 +1828,7 @@ void CWriter::ComputeUniqueImports() {
for (const auto& node : import_map) {
unique_imports_.push_back(node.second);
}
return Result::Ok;
}

void CWriter::BeginInstance() {
Expand All @@ -1830,8 +1837,6 @@ void CWriter::BeginInstance() {
return;
}

ComputeUniqueImports();

// define names of per-instance imports
for (const Import* import : module_->imports) {
DefineImportName(import, import->module_name, import->field_name);
Expand Down Expand Up @@ -6177,6 +6182,9 @@ void CWriter::WriteCSource() {
Result CWriter::WriteModule(const Module& module) {
WABT_USE(options_);
module_ = &module;

CHECK_RESULT(ComputeUniqueImports());

WriteCHeader();
WriteCSource();
return result_;
Expand Down
9 changes: 9 additions & 0 deletions test/wasm2c/contradictory-imports.txt
Original file line number Diff line number Diff line change
@@ -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 ;;)
Loading