From 689abf3e87f82f253b2498b055f2cc844ad95f2c Mon Sep 17 00:00:00 2001 From: Evan Typanski Date: Thu, 6 Mar 2025 15:00:30 -0500 Subject: [PATCH] Reject equivalent functions. Fixes #1982 --- hilti/toolchain/src/ast/types/function.cc | 3 +++ tests/Baseline/hilti.validation.duplicate-6/output | 4 ++++ tests/hilti/validation/duplicate.hlt | 13 +++++++++++++ 3 files changed, 20 insertions(+) create mode 100644 tests/Baseline/hilti.validation.duplicate-6/output diff --git a/hilti/toolchain/src/ast/types/function.cc b/hilti/toolchain/src/ast/types/function.cc index dcf9d914f..488bc43a2 100644 --- a/hilti/toolchain/src/ast/types/function.cc +++ b/hilti/toolchain/src/ast/types/function.cc @@ -28,6 +28,9 @@ bool type::Function::isResolved(node::CycleDetector* cd) const { } bool type::isValidOverload(Function* f1, Function* f2) { + if ( f1->flavor() != function::Flavor::Hook && areEquivalent(f1, f2) ) + return false; + const auto& params1 = f1->parameters(); const auto& params2 = f2->parameters(); diff --git a/tests/Baseline/hilti.validation.duplicate-6/output b/tests/Baseline/hilti.validation.duplicate-6/output new file mode 100644 index 000000000..38e9fa727 --- /dev/null +++ b/tests/Baseline/hilti.validation.duplicate-6/output @@ -0,0 +1,4 @@ +### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63. +[error] <...>/duplicate.hlt:6:1-6:33: 'fail1' is not a valid overload; previous definition in <...>/duplicate.hlt:5:1-5:33 +[error] <...>/duplicate.hlt:9:1-9:72: 'fail2' is not a valid overload; previous definition in <...>/duplicate.hlt:8:1-8:60 +[error] hiltic: aborting after errors diff --git a/tests/hilti/validation/duplicate.hlt b/tests/hilti/validation/duplicate.hlt index 427496f1c..2bdacada5 100644 --- a/tests/hilti/validation/duplicate.hlt +++ b/tests/hilti/validation/duplicate.hlt @@ -70,3 +70,16 @@ function uint<16> fun(uint<8> a, uint<8> b = uint8(0)) { hilti::print(fun(uint8(1))); } + +# @TEST-START-NEXT + +module Foo { + +# Equivalent functions signatures should not be allowed. +function void fail1() { return; } +function void fail1() { return; } + +function string fail2(uint<8> x, string y) { return "hi!"; } +function string fail2(uint<8> different, string names) { return "hi!"; } + +}