diff --git a/src/lib/Lib/CorpusImpl.cpp b/src/lib/Lib/CorpusImpl.cpp index 158654f95f..11411e9939 100644 --- a/src/lib/Lib/CorpusImpl.cpp +++ b/src/lib/Lib/CorpusImpl.cpp @@ -129,11 +129,71 @@ findFirstParentInfo( } } +bool +qualifiedNameCompare( + Polymorphic const& lhs0, + Polymorphic const& rhs0, + Info const& context, + CorpusImpl const& corpus) +{ + MRDOCS_CHECK_OR(lhs0 && rhs0, false); + // Compare each component of the qualified name + NameInfo const* lhs = &*lhs0; + NameInfo const* rhs = &*rhs0; + while (lhs && rhs) + { + if (lhs->Name != rhs->Name) + { + return false; + } + lhs = lhs->Prefix ? &*lhs->Prefix : nullptr; + rhs = rhs->Prefix ? &*rhs->Prefix : nullptr; + } + // We consumed all components of both names + if (!lhs && !rhs) + { + return true; + } + // One name has more components than the other: + // these component should match the names from + // the context. When we doesn't match the context + // we try again with the parent context. + NameInfo const* curName0 = lhs ? lhs : rhs; + Info const* curContext0 = &context; + NameInfo const* curName = curName0; + Info const* curContext = curContext0; + while (curName && curContext) + { + if (curName->Name != curContext->Name) + { + // The name doesn't match the context name + // Try again, starting from the parent + // context. + curName = curName0; + curContext0 = curContext0->Parent ? corpus.find(curContext->Parent) : nullptr; + // No parent context to try: return false + if (!curContext0) + { + return false; + } + curContext = curContext0; + continue; + } + // Names matches, match next component + curName = curName->Prefix ? &*curName->Prefix : nullptr; + curContext = curContext->Parent ? corpus.find(curContext->Parent) : nullptr; + } + // We should have consumed all components of the name with the context + return !curName; +} + template bool isDecayedEqualImpl( Polymorphic const& lhs, - Polymorphic const& rhs) + Polymorphic const& rhs, + Info const& context, + CorpusImpl const& corpus) { // Polymorphic MRDOCS_CHECK_OR(static_cast(lhs) == static_cast(rhs), false); @@ -161,13 +221,16 @@ isDecayedEqualImpl( MRDOCS_CHECK_OR(lhs->Constraints == rhs->Constraints, false); switch (lhs->Kind) { - // Types that never decay are compared directly + // Types that never decay are compared directly, but we + // only compare the fields of the type, without reevaluating + // the fields of TypeInfo. case TypeKind::Named: { - // Compare only the fields of NameInfo, without - // TypeInfo, to avoid evaluating TypeInfo::IsConst - return dynamic_cast(*lhs).Name == - dynamic_cast(*rhs).Name; + return + qualifiedNameCompare( + dynamic_cast(*lhs).Name, + dynamic_cast(*rhs).Name, + context, corpus); } case TypeKind::Decltype: { @@ -186,22 +249,24 @@ isDecayedEqualImpl( return isDecayedEqualImpl( dynamic_cast(*lhs).PointeeType, - dynamic_cast(*rhs).PointeeType); + dynamic_cast(*rhs).PointeeType, + context, corpus); } case TypeKind::RValueReference: { return isDecayedEqualImpl( dynamic_cast(*lhs).PointeeType, - dynamic_cast(*rhs).PointeeType); + dynamic_cast(*rhs).PointeeType, + context, corpus); } case TypeKind::MemberPointer: { auto const& lhsMP = dynamic_cast(*lhs); auto const& rhsMP = dynamic_cast(*rhs); return - isDecayedEqualImpl(lhsMP.PointeeType, rhsMP.PointeeType) && - isDecayedEqualImpl(lhsMP.ParentType, rhsMP.ParentType); + isDecayedEqualImpl(lhsMP.PointeeType, rhsMP.PointeeType, context, corpus) && + isDecayedEqualImpl(lhsMP.ParentType, rhsMP.ParentType, context, corpus); } case TypeKind::Function: { @@ -210,11 +275,11 @@ isDecayedEqualImpl( MRDOCS_CHECK_OR(lhsF.RefQualifier == rhsF.RefQualifier, false); MRDOCS_CHECK_OR(lhsF.ExceptionSpec == rhsF.ExceptionSpec, false); MRDOCS_CHECK_OR(lhsF.IsVariadic == rhsF.IsVariadic, false); - MRDOCS_CHECK_OR(isDecayedEqualImpl(lhsF.ReturnType, rhsF.ReturnType), false); + MRDOCS_CHECK_OR(isDecayedEqualImpl(lhsF.ReturnType, rhsF.ReturnType, context, corpus), false); MRDOCS_CHECK_OR(lhsF.ParamTypes.size() == rhsF.ParamTypes.size(), false); for (std::size_t i = 0; i < lhsF.ParamTypes.size(); ++i) { - MRDOCS_CHECK_OR(isDecayedEqualImpl(lhsF.ParamTypes[i], rhsF.ParamTypes[i]), false); + MRDOCS_CHECK_OR(isDecayedEqualImpl(lhsF.ParamTypes[i], rhsF.ParamTypes[i], context, corpus), false); } return true; } @@ -226,7 +291,7 @@ isDecayedEqualImpl( auto const I2 = innerType(*rhs); MRDOCS_CHECK_OR(static_cast(I1) == static_cast(I2), false); MRDOCS_CHECK_OR(static_cast(I1) && static_cast(I2), true); - return isDecayedEqualImpl(I1->get(), I2->get()); + return isDecayedEqualImpl(I1->get(), I2->get(), context, corpus); } default: MRDOCS_UNREACHABLE(); @@ -240,9 +305,11 @@ isDecayedEqualImpl( bool isDecayedEqual( Polymorphic const& lhs, - Polymorphic const& rhs) + Polymorphic const& rhs, + Info const& context, + CorpusImpl const& corpus) { - return isDecayedEqualImpl(lhs, rhs); + return isDecayedEqualImpl(lhs, rhs, context, corpus); } } @@ -513,7 +580,7 @@ lookupImpl( { auto& lhsType = F.Params[i].Type; auto& rhsType = ref.FunctionParameters[i]; - MRDOCS_CHECK_OR(isDecayedEqual(lhsType, rhsType), matchRes); + MRDOCS_CHECK_OR(isDecayedEqual(lhsType, rhsType, context, *this), matchRes); } MRDOCS_CHECK_OR(F.IsVariadic == ref.IsVariadic, matchRes); matchRes = MatchLevel::FunctionParameters; diff --git a/test-files/golden-tests/javadoc/copydoc/qualified.adoc b/test-files/golden-tests/javadoc/copydoc/qualified.adoc new file mode 100644 index 0000000000..9ec9bdabfe --- /dev/null +++ b/test-files/golden-tests/javadoc/copydoc/qualified.adoc @@ -0,0 +1,743 @@ += Reference +:mrdocs: + +[#index] +== Global namespace + + +=== Namespaces + +[cols=1] +|=== +| Name + +| <> + +|=== +=== Types + +[cols=2] +|=== +| Name +| Description + +| <> +| Helper class for distinct parameter types + +|=== + +[#N] +== N + + +=== Types + +[cols=1] +|=== +| Name + +| <> + +|=== + +[#N-A] +== <>::A + + +=== Synopsis + + +Declared in `<qualified.cpp>` + +[source,cpp,subs="verbatim,replacements,macros,-callouts"] +---- +struct A; +---- + +=== Types + +[cols=1] +|=== +| Name + +| <> + +|=== +=== Member Functions + +[cols=2] +|=== +| Name +| Description + +| <> +| Reference function + +| <> +| `g` overloads + +| <> +| `h` overloads + +|=== + + + +[#N-A-B] +== <>::<>::B + + +=== Synopsis + + +Declared in `<qualified.cpp>` + +[source,cpp,subs="verbatim,replacements,macros,-callouts"] +---- +struct B; +---- + + + + +[#N-A-f-05] +== <>::<>::f + + +Reference function + +=== Synopses + + +Declared in `<qualified.cpp>` + +Reference function + + +[source,cpp,subs="verbatim,replacements,macros,-callouts"] +---- +void +<>(<><0> a); +---- + +[.small]#<># + +Reference function + + +[source,cpp,subs="verbatim,replacements,macros,-callouts"] +---- +void +<>(<><1> a); +---- + +[.small]#<># + +Reference function + + +[source,cpp,subs="verbatim,replacements,macros,-callouts"] +---- +void +<>(<><2> a); +---- + +[.small]#<># + +Reference function + + +[source,cpp,subs="verbatim,replacements,macros,-callouts"] +---- +void +<>(<><3> a); +---- + +[.small]#<># + +Reference function + + +[source,cpp,subs="verbatim,replacements,macros,-callouts"] +---- +void +<>(<><4> a); +---- + +[.small]#<># + +Reference function + + +[source,cpp,subs="verbatim,replacements,macros,-callouts"] +---- +void +<>(<><5> a); +---- + +[.small]#<># + +Reference function + + +[source,cpp,subs="verbatim,replacements,macros,-callouts"] +---- +void +<>(<><6> a); +---- + +[.small]#<># + +Reference function + + +[source,cpp,subs="verbatim,replacements,macros,-callouts"] +---- +void +<>(<><7> a); +---- + +[.small]#<># + +=== Parameters + + +|=== +| Name | Description + +| *a* +| Qualified param + +|=== + +[#N-A-f-0a] +== <>::<>::f + + +Reference function + +=== Synopsis + + +Declared in `<qualified.cpp>` + +[source,cpp,subs="verbatim,replacements,macros,-callouts"] +---- +void +f(<><0> a); +---- + +=== Description + + +Documentation for the reference function + + + +=== Parameters + + +|=== +| Name | Description + +| *a* +| Qualified param + +|=== + +[#N-A-f-0b] +== <>::<>::f + + +Reference function + +=== Synopsis + + +Declared in `<qualified.cpp>` + +[source,cpp,subs="verbatim,replacements,macros,-callouts"] +---- +void +f(<><1> a); +---- + +=== Description + + +Documentation for the reference function + + + +=== Parameters + + +|=== +| Name | Description + +| *a* +| Qualified param + +|=== + +[#N-A-f-0e] +== <>::<>::f + + +Reference function + +=== Synopsis + + +Declared in `<qualified.cpp>` + +[source,cpp,subs="verbatim,replacements,macros,-callouts"] +---- +void +f(<><2> a); +---- + +=== Description + + +Documentation for the reference function + + + +=== Parameters + + +|=== +| Name | Description + +| *a* +| Qualified param + +|=== + +[#N-A-f-00] +== <>::<>::f + + +Reference function + +=== Synopsis + + +Declared in `<qualified.cpp>` + +[source,cpp,subs="verbatim,replacements,macros,-callouts"] +---- +void +f(<><3> a); +---- + +=== Description + + +Documentation for the reference function + + + +=== Parameters + + +|=== +| Name | Description + +| *a* +| Qualified param + +|=== + +[#N-A-f-02] +== <>::<>::f + + +Reference function + +=== Synopsis + + +Declared in `<qualified.cpp>` + +[source,cpp,subs="verbatim,replacements,macros,-callouts"] +---- +void +f(<><4> a); +---- + +=== Description + + +Documentation for the reference function + + + +=== Parameters + + +|=== +| Name | Description + +| *a* +| Qualified param + +|=== + +[#N-A-f-092] +== <>::<>::f + + +Reference function + +=== Synopsis + + +Declared in `<qualified.cpp>` + +[source,cpp,subs="verbatim,replacements,macros,-callouts"] +---- +void +f(<><5> a); +---- + +=== Description + + +Documentation for the reference function + + + +=== Parameters + + +|=== +| Name | Description + +| *a* +| Qualified param + +|=== + +[#N-A-f-097] +== <>::<>::f + + +Reference function + +=== Synopsis + + +Declared in `<qualified.cpp>` + +[source,cpp,subs="verbatim,replacements,macros,-callouts"] +---- +void +f(<><6> a); +---- + +=== Description + + +Documentation for the reference function + + + +=== Parameters + + +|=== +| Name | Description + +| *a* +| Qualified param + +|=== + +[#N-A-f-07] +== <>::<>::f + + +Reference function + +=== Synopsis + + +Declared in `<qualified.cpp>` + +[source,cpp,subs="verbatim,replacements,macros,-callouts"] +---- +void +f(<><7> a); +---- + +=== Description + + +Documentation for the reference function + + + +=== Parameters + + +|=== +| Name | Description + +| *a* +| Qualified param + +|=== + +[#N-A-g-0d] +== <>::<>::g + + +`g` overloads + +=== Synopses + + +Declared in `<qualified.cpp>` + +Reference function + + +[source,cpp,subs="verbatim,replacements,macros,-callouts"] +---- +void +<>(<> a); +---- + +[.small]#<># + +Fail + + +[source,cpp,subs="verbatim,replacements,macros,-callouts"] +---- +void +<>(int a); +---- + +[.small]#<># + +=== Parameters + + +|=== +| Name | Description + +| *a* +| Qualified param + +|=== + +[#N-A-g-0a] +== <>::<>::g + + +Reference function + +=== Synopsis + + +Declared in `<qualified.cpp>` + +[source,cpp,subs="verbatim,replacements,macros,-callouts"] +---- +void +g(<> a); +---- + +=== Description + + +Documentation for the reference function + + + +=== Parameters + + +|=== +| Name | Description + +| *a* +| Qualified param + +|=== + +[#N-A-g-06] +== <>::<>::g + + +Fail + +=== Synopsis + + +Declared in `<qualified.cpp>` + +[source,cpp,subs="verbatim,replacements,macros,-callouts"] +---- +void +g(int a); +---- + +=== Description + + +Function with same number of parameters but different types. This should fail. + + + +=== Parameters + + +|=== +| Name | Description + +| *a* +| Fundamental type parameter + +|=== + +[#N-A-h-0b] +== <>::<>::h + + +`h` overloads + +=== Synopses + + +Declared in `<qualified.cpp>` + +Reference function + + +[source,cpp,subs="verbatim,replacements,macros,-callouts"] +---- +void +<>(<>::<>::<> a); +---- + +[.small]#<># + +Fail + + +[source,cpp,subs="verbatim,replacements,macros,-callouts"] +---- +void +<>(int a); +---- + +[.small]#<># + +=== Parameters + + +|=== +| Name | Description + +| *a* +| Qualified param + +|=== + +[#N-A-h-0f] +== <>::<>::h + + +Reference function + +=== Synopsis + + +Declared in `<qualified.cpp>` + +[source,cpp,subs="verbatim,replacements,macros,-callouts"] +---- +void +h(<>::<>::<> a); +---- + +=== Description + + +Documentation for the reference function + + + +=== Parameters + + +|=== +| Name | Description + +| *a* +| Qualified param + +|=== + +[#N-A-h-06] +== <>::<>::h + + +Fail + +=== Synopsis + + +Declared in `<qualified.cpp>` + +[source,cpp,subs="verbatim,replacements,macros,-callouts"] +---- +void +h(int a); +---- + +=== Description + + +Function with same number of parameters but different types. This should fail. + + + +=== Parameters + + +|=== +| Name | Description + +| *a* +| Fundamental type parameter + +|=== + +[#param_t] +== param_t + + +Helper class for distinct parameter types + +=== Synopsis + + +Declared in `<qualified.cpp>` + +[source,cpp,subs="verbatim,replacements,macros,-callouts"] +---- +template<int N> +class param_t; +---- + + + + + + +[.small]#Created with https://www.mrdocs.com[MrDocs]# diff --git a/test-files/golden-tests/javadoc/copydoc/qualified.cpp b/test-files/golden-tests/javadoc/copydoc/qualified.cpp new file mode 100644 index 0000000000..e0b9f3e77d --- /dev/null +++ b/test-files/golden-tests/javadoc/copydoc/qualified.cpp @@ -0,0 +1,67 @@ +/// Helper class for distinct parameter types +template +class param_t; + +namespace N { + struct A { + struct B {}; + + /** Fail + + Function with same number of parameters + but different types. This should fail. + + @param a Fundamental type parameter + */ + void g(int a); + + /** Reference function + + Documentation for the reference function + + @param a Qualified param + */ + void g(B a); + + /// @copydoc g(B) + void f(param_t<0> a); + + /// @copydoc g(A::B) + void f(param_t<1> a); + + /// @copydoc g(N::A::B) + void f(param_t<2> a); + + /// @copydoc g(::N::A::B) + void f(param_t<3> a); + + /** Fail + + Function with same number of parameters + but different types. This should fail. + + @param a Fundamental type parameter + */ + void h(int a); + + /** Reference function + + Documentation for the reference function + + @param a Qualified param + */ + void h(::N::A::B a); + + /// @copydoc h(B) + void f(param_t<4> a); + + /// @copydoc h(A::B) + void f(param_t<5> a); + + /// @copydoc h(N::A::B) + void f(param_t<6> a); + + /// @copydoc h(::N::A::B) + void f(param_t<7> a); + }; +} \ No newline at end of file diff --git a/test-files/golden-tests/javadoc/copydoc/qualified.html b/test-files/golden-tests/javadoc/copydoc/qualified.html new file mode 100644 index 0000000000..7a0bc2edd2 --- /dev/null +++ b/test-files/golden-tests/javadoc/copydoc/qualified.html @@ -0,0 +1,954 @@ + + +Reference + + +
+

Reference

+
+
+

Global namespace

+
+

Namespaces

+ + + + + + + + + + + +
Name
N
+

Types

+ + + + + + + + + + + + +
NameDescription
param_t Helper class for distinct parameter types +
+
+
+
+

N

+
+

Types

+ + + + + + + + + + + +
Name
A
+
+
+
+

N::A

+
+
+

Synopsis

+
+Declared in <qualified.cpp>
+
+
+struct A;
+
+
+
+

Types

+ + + + + + + + + + + +
Name
B
+

Member Functions

+ + + + + + + + + + + + + + + + +
NameDescription
f Reference function +
g g overloads +
h h overloads +
+ + +
+
+
+

N::A::B

+
+
+

Synopsis

+
+Declared in <qualified.cpp>
+
+
+struct B;
+
+
+
+ + +
+
+
+

N::A::f

+
+Reference function + + +
+
+
+

Synopses

+
+Declared in <qualified.cpp>
+

+ Reference function + +

+ + +
+
+void
+f(param_t<0> a);
+
+
» more... + +

+ Reference function + +

+ + +
+
+void
+f(param_t<1> a);
+
+
» more... + +

+ Reference function + +

+ + +
+
+void
+f(param_t<2> a);
+
+
» more... + +

+ Reference function + +

+ + +
+
+void
+f(param_t<3> a);
+
+
» more... + +

+ Reference function + +

+ + +
+
+void
+f(param_t<4> a);
+
+
» more... + +

+ Reference function + +

+ + +
+
+void
+f(param_t<5> a);
+
+
» more... + +

+ Reference function + +

+ + +
+
+void
+f(param_t<6> a);
+
+
» more... + +

+ Reference function + +

+ + +
+
+void
+f(param_t<7> a);
+
+
» more... + + +
+
+

Parameters

+ + + + + + + + + + + + + +
NameDescription
a

Qualified param

+
+
+
+
+
+

N::A::f

+
+Reference function + + +
+
+
+

Synopsis

+
+Declared in <qualified.cpp>
+
+
+void
+f(param_t<0> a);
+
+
+
+
+

Description

+

Documentation for the reference function

+ + +
+
+

Parameters

+ + + + + + + + + + + + + +
NameDescription
a

Qualified param

+
+
+
+
+
+

N::A::f

+
+Reference function + + +
+
+
+

Synopsis

+
+Declared in <qualified.cpp>
+
+
+void
+f(param_t<1> a);
+
+
+
+
+

Description

+

Documentation for the reference function

+ + +
+
+

Parameters

+ + + + + + + + + + + + + +
NameDescription
a

Qualified param

+
+
+
+
+
+

N::A::f

+
+Reference function + + +
+
+
+

Synopsis

+
+Declared in <qualified.cpp>
+
+
+void
+f(param_t<2> a);
+
+
+
+
+

Description

+

Documentation for the reference function

+ + +
+
+

Parameters

+ + + + + + + + + + + + + +
NameDescription
a

Qualified param

+
+
+
+
+
+

N::A::f

+
+Reference function + + +
+
+
+

Synopsis

+
+Declared in <qualified.cpp>
+
+
+void
+f(param_t<3> a);
+
+
+
+
+

Description

+

Documentation for the reference function

+ + +
+
+

Parameters

+ + + + + + + + + + + + + +
NameDescription
a

Qualified param

+
+
+
+
+
+

N::A::f

+
+Reference function + + +
+
+
+

Synopsis

+
+Declared in <qualified.cpp>
+
+
+void
+f(param_t<4> a);
+
+
+
+
+

Description

+

Documentation for the reference function

+ + +
+
+

Parameters

+ + + + + + + + + + + + + +
NameDescription
a

Qualified param

+
+
+
+
+
+

N::A::f

+
+Reference function + + +
+
+
+

Synopsis

+
+Declared in <qualified.cpp>
+
+
+void
+f(param_t<5> a);
+
+
+
+
+

Description

+

Documentation for the reference function

+ + +
+
+

Parameters

+ + + + + + + + + + + + + +
NameDescription
a

Qualified param

+
+
+
+
+
+

N::A::f

+
+Reference function + + +
+
+
+

Synopsis

+
+Declared in <qualified.cpp>
+
+
+void
+f(param_t<6> a);
+
+
+
+
+

Description

+

Documentation for the reference function

+ + +
+
+

Parameters

+ + + + + + + + + + + + + +
NameDescription
a

Qualified param

+
+
+
+
+
+

N::A::f

+
+Reference function + + +
+
+
+

Synopsis

+
+Declared in <qualified.cpp>
+
+
+void
+f(param_t<7> a);
+
+
+
+
+

Description

+

Documentation for the reference function

+ + +
+
+

Parameters

+ + + + + + + + + + + + + +
NameDescription
a

Qualified param

+
+
+
+
+
+

N::A::g

+
+g overloads + + +
+
+
+

Synopses

+
+Declared in <qualified.cpp>
+

+ Reference function + +

+ + +
+
+void
+g(B a);
+
+
» more... + +

+ Fail + +

+ + +
+
+void
+g(int a);
+
+
» more... + + +
+
+

Parameters

+ + + + + + + + + + + + + +
NameDescription
a

Qualified param

+
+
+
+
+
+

N::A::g

+
+Reference function + + +
+
+
+

Synopsis

+
+Declared in <qualified.cpp>
+
+
+void
+g(B a);
+
+
+
+
+

Description

+

Documentation for the reference function

+ + +
+
+

Parameters

+ + + + + + + + + + + + + +
NameDescription
a

Qualified param

+
+
+
+
+
+

N::A::g

+
+Fail + + +
+
+
+

Synopsis

+
+Declared in <qualified.cpp>
+
+
+void
+g(int a);
+
+
+
+
+

Description

+

Function with same number of parameters but different types. This should fail.

+ + +
+
+

Parameters

+ + + + + + + + + + + + + +
NameDescription
a

Fundamental type parameter

+
+
+
+
+
+

N::A::h

+
+h overloads + + +
+
+
+

Synopses

+
+Declared in <qualified.cpp>
+

+ Reference function + +

+ + +
+
+void
+h(N::A::B a);
+
+
» more... + +

+ Fail + +

+ + +
+
+void
+h(int a);
+
+
» more... + + +
+
+

Parameters

+ + + + + + + + + + + + + +
NameDescription
a

Qualified param

+
+
+
+
+
+

N::A::h

+
+Reference function + + +
+
+
+

Synopsis

+
+Declared in <qualified.cpp>
+
+
+void
+h(N::A::B a);
+
+
+
+
+

Description

+

Documentation for the reference function

+ + +
+
+

Parameters

+ + + + + + + + + + + + + +
NameDescription
a

Qualified param

+
+
+
+
+
+

N::A::h

+
+Fail + + +
+
+
+

Synopsis

+
+Declared in <qualified.cpp>
+
+
+void
+h(int a);
+
+
+
+
+

Description

+

Function with same number of parameters but different types. This should fail.

+ + +
+
+

Parameters

+ + + + + + + + + + + + + +
NameDescription
a

Fundamental type parameter

+
+
+
+
+
+

param_t

+
+Helper class for distinct parameter types + + +
+
+
+

Synopsis

+
+Declared in <qualified.cpp>
+
+
+template<int N>
+class param_t;
+
+
+
+ + +
+ +
+
+

Created with MrDocs

+
+ + \ No newline at end of file diff --git a/test-files/golden-tests/javadoc/copydoc/qualified.xml b/test-files/golden-tests/javadoc/copydoc/qualified.xml new file mode 100644 index 0000000000..45a6b6d9c6 --- /dev/null +++ b/test-files/golden-tests/javadoc/copydoc/qualified.xml @@ -0,0 +1,229 @@ + + + + + + + + + + + + + + + + + Reference function + + + Documentation for the reference function + + + Qualified param + + + + + + + + + + + Reference function + + + Documentation for the reference function + + + Qualified param + + + + + + + + + + + Reference function + + + Documentation for the reference function + + + Qualified param + + + + + + + + + + + Reference function + + + Documentation for the reference function + + + Qualified param + + + + + + + + + + + Reference function + + + Documentation for the reference function + + + Qualified param + + + + + + + + + + + Reference function + + + Documentation for the reference function + + + Qualified param + + + + + + + + + + + Reference function + + + Documentation for the reference function + + + Qualified param + + + + + + + + + + + Reference function + + + Documentation for the reference function + + + Qualified param + + + + + + + + + + + Reference function + + + Documentation for the reference function + + + Qualified param + + + + + + + + + + + Fail + + + Function with same number of parameters but different types. This should fail. + + + Fundamental type parameter + + + + + + + + + + + Reference function + + + Documentation for the reference function + + + Qualified param + + + + + + + + + + + Fail + + + Function with same number of parameters but different types. This should fail. + + + Fundamental type parameter + + + + + + + +