Index: lld/trunk/test/wasm/Inputs/strong-symbol.ll =================================================================== --- lld/trunk/test/wasm/Inputs/strong-symbol.ll +++ lld/trunk/test/wasm/Inputs/strong-symbol.ll @@ -0,0 +1,6 @@ +target triple = "wasm32-unknown-unknown-wasm" + +define i64 @weakFn() #0 { +entry: + ret i64 1 +} Index: lld/trunk/test/wasm/signature-mismatch-weak.ll =================================================================== --- lld/trunk/test/wasm/signature-mismatch-weak.ll +++ lld/trunk/test/wasm/signature-mismatch-weak.ll @@ -0,0 +1,19 @@ +; RUN: llc -filetype=obj %p/Inputs/weak-symbol1.ll -o %t.weak.o +; RUN: llc -filetype=obj %p/Inputs/strong-symbol.ll -o %t.strong.o +; RUN: llc -filetype=obj %s -o %t.o +; RUN: not wasm-ld --check-signatures -o %t.wasm %t.o %t.strong.o %t.weak.o 2>&1 | FileCheck %s +; RUN: wasm-ld -o %t.wasm %t.o %t.strong.o %t.weak.o + +target triple = "wasm32-unknown-unknown-wasm" + +declare i32 @weakFn() local_unnamed_addr + +define void @_start() local_unnamed_addr { +entry: + %call = call i32 @weakFn() + ret void +} + +; CHECK: error: function signature mismatch: weakFn +; CHECK-NEXT: >>> defined as () -> I32 in {{.*}}signature-mismatch-weak.ll.tmp.o +; CHECK-NEXT: >>> defined as () -> I64 in {{.*}}signature-mismatch-weak.ll.tmp.strong.o Index: lld/trunk/wasm/SymbolTable.cpp =================================================================== --- lld/trunk/wasm/SymbolTable.cpp +++ lld/trunk/wasm/SymbolTable.cpp @@ -175,6 +175,7 @@ } else if ((Flags & WASM_SYMBOL_BINDING_MASK) == WASM_SYMBOL_BINDING_WEAK) { // the new symbol is weak we can ignore it DEBUG(dbgs() << "existing symbol takes precedence\n"); + CheckTypes = true; } else if (S->isWeak()) { // the existing symbol is, so we replace it DEBUG(dbgs() << "replacing existing weak symbol\n");