summaryrefslogtreecommitdiff
path: root/formula
diff options
context:
space:
mode:
authorEike Rathke <erack@redhat.com>2019-01-15 19:59:53 +0100
committerEike Rathke <erack@redhat.com>2019-01-16 11:17:14 +0100
commitd0ded163d8e93dc5b10d7a7c9bdab1d0a6a50bac (patch)
tree95b4ff7862ba6114f0f4072fb244586e1b4d882b /formula
parentd08425c14b29bbac9f33c234f89b451388cd1d7c (diff)
Related: tdf#122301 FREQUENCY() with ForceArrayReturn on caller
FREQUENCY() forces its direct caller into array mode, but only for the immediate subexpression and not for further operators of the same parameter. This weird Excel behaviour is stated in ECMA-376-1:2016 OOXML 18.17.7.127 FREQUENCY "A call to FREQUENCY shall be an array formula." somewhat unclear what it actually applies to, but it turned out that "a call" is indeed *only* THE direct call, see https://bugs.documentfoundation.org/show_bug.cgi?id=122301#c19 Change-Id: I145d8fe26d75d5af25b987e190bf35f2d2c03ec6 Reviewed-on: https://gerrit.libreoffice.org/66407 Reviewed-by: Eike Rathke <erack@redhat.com> Tested-by: Jenkins
Diffstat (limited to 'formula')
-rw-r--r--formula/source/core/api/FormulaCompiler.cxx7
-rw-r--r--formula/source/core/api/token.cxx2
-rw-r--r--formula/source/ui/dlg/formula.cxx1
3 files changed, 9 insertions, 1 deletions
diff --git a/formula/source/core/api/FormulaCompiler.cxx b/formula/source/core/api/FormulaCompiler.cxx
index da1769d13b17..f243aab357f7 100644
--- a/formula/source/core/api/FormulaCompiler.cxx
+++ b/formula/source/core/api/FormulaCompiler.cxx
@@ -2746,6 +2746,13 @@ void FormulaCompiler::ForceArrayOperator( FormulaTokenRef const & rCurr )
else
rCurr->SetInForceArray( formula::ParamClass::SuppressedReferenceOrForceArray);
}
+
+ // Propagate a ForceArrayReturn to caller if the called function
+ // returns one and the caller so far does not have a stronger array
+ // mode set.
+ if (pCurrentFactorToken->GetInForceArray() == ParamClass::Unknown
+ && GetForceArrayParameter( rCurr.get(), SAL_MAX_UINT16) == ParamClass::ForceArrayReturn)
+ pCurrentFactorToken->SetInForceArray( ParamClass::ForceArrayReturn);
}
}
diff --git a/formula/source/core/api/token.cxx b/formula/source/core/api/token.cxx
index aa3dbec8c8ef..a80897c280fb 100644
--- a/formula/source/core/api/token.cxx
+++ b/formula/source/core/api/token.cxx
@@ -151,7 +151,7 @@ bool FormulaToken::IsInForceArray() const
{
ParamClass eParam = GetInForceArray();
return eParam == ParamClass::ForceArray || eParam == ParamClass::ReferenceOrForceArray
- || eParam == ParamClass::ReferenceOrRefArray;
+ || eParam == ParamClass::ReferenceOrRefArray || eParam == ParamClass::ForceArrayReturn;
}
bool FormulaToken::operator==( const FormulaToken& rToken ) const
diff --git a/formula/source/ui/dlg/formula.cxx b/formula/source/ui/dlg/formula.cxx
index adfe4e210f2d..d1052c3a4142 100644
--- a/formula/source/ui/dlg/formula.cxx
+++ b/formula/source/ui/dlg/formula.cxx
@@ -757,6 +757,7 @@ void FormulaDlg_Impl::MakeTree( StructPage* _pTree, SvTreeListEntry* pParent, co
case ParamClass::ForceArray:
case ParamClass::ReferenceOrForceArray:
case ParamClass::SuppressedReferenceOrForceArray:
+ case ParamClass::ForceArrayReturn:
; // nothing, only as array/matrix
// no default to get compiler warning
}