summaryrefslogtreecommitdiff
path: root/formula
diff options
context:
space:
mode:
authorEike Rathke <erack@redhat.com>2020-09-08 21:18:30 +0200
committerEike Rathke <erack@redhat.com>2020-09-09 01:14:22 +0200
commite00e2be30436b636d93f8852bb6af44972638a7c (patch)
treebb7c75717a2c899d9b4922ada36ec10863f34c3a /formula
parentcd268f0047443ddbb22361cdc15093e881f83588 (diff)
Resolves: tdf#136364 treat svSep type with ocUnion as range type
So for RPN sv...Ref(ocPush), sv...Ref(ocPush), svSep(ocUnion), sv...Ref(ocPush) another svSep(ocUnion) instead of svSep(ocSep) is appended. Regression from commit a6032ff5418ad66cc8fec10c636e32b124ee7864 CommitDate: Thu Oct 11 11:26:37 2018 +0200 Resolves: tdf#90698 catch list (1;2) of non-references as error that introduced a conditional check on operands and operators. Change-Id: If5da3a781f24f891ff12c4a8f32a2ec92c6b4c8a Reviewed-on: https://gerrit.libreoffice.org/c/core/+/102276 Reviewed-by: Eike Rathke <erack@redhat.com> Tested-by: Jenkins
Diffstat (limited to 'formula')
-rw-r--r--formula/source/core/api/FormulaCompiler.cxx7
1 files changed, 6 insertions, 1 deletions
diff --git a/formula/source/core/api/FormulaCompiler.cxx b/formula/source/core/api/FormulaCompiler.cxx
index da5f7428e196..e6a224fa93a7 100644
--- a/formula/source/core/api/FormulaCompiler.cxx
+++ b/formula/source/core/api/FormulaCompiler.cxx
@@ -305,7 +305,7 @@ bool isRangeResultOpCode( OpCode eOp )
@param bRight
If bRPN==false, bRight==false means opcodes for left side are
checked, bRight==true means opcodes for right side. If bRPN==true
- it doesn't matter.
+ it doesn't matter except for the ocSep converted to ocUnion case.
*/
bool isPotentialRangeType( FormulaToken const * pToken, bool bRPN, bool bRight )
{
@@ -326,6 +326,10 @@ bool isPotentialRangeType( FormulaToken const * pToken, bool bRPN, bool bRight )
case svExternalDoubleRef:
case svExternalName: // could be range
return true;
+ case svSep:
+ // A special case if a previous ocSep was converted to ocUnion it
+ // stays svSep instead of svByte.
+ return bRPN && !bRight && pToken->GetOpCode() == ocUnion;
default:
// Separators are not part of RPN and right opcodes need to be
// other StackVar types or functions and thus svByte.
@@ -1407,6 +1411,7 @@ void FormulaCompiler::Factor()
if (p && isPotentialRangeType( p, true, true))
{
pFacToken->NewOpCode( ocUnion, FormulaToken::PrivateAccess());
+ // XXX NOTE: the token's eType is still svSep here!
PutCode( pFacToken);
}
}