sc/inc/tokenuno.hxx                     |    3 ++-
 sc/source/filter/oox/defnamesbuffer.cxx |   10 ++++++++--
 sc/source/ui/unoobj/tokenuno.cxx        |    7 +++++--
 3 files changed, 15 insertions(+), 5 deletions(-)

New commits:
commit 6e12713a7938e464b55a54b9dfd662000057a85f
Author:     Eike Rathke <er...@redhat.com>
AuthorDate: Tue Aug 6 00:47:26 2024 +0200
Commit:     Caolán McNamara <caolan.mcnam...@collabora.com>
CommitDate: Tue Aug 6 09:12:04 2024 +0200

    Do not assert TableRef inner reference for dumb sequence, tdf#159343
    
    ... of FormulaToken that's only created to extract a range from an
    expression because that OOXML import part doesn't know to operate
    on a ScTokenArray.
    
    Change-Id: I4011723b682c3eae0e1c8d8e768553154c024061
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/171516
    Reviewed-by: Eike Rathke <er...@redhat.com>
    Tested-by: Jenkins
    Reviewed-by: Caolán McNamara <caolan.mcnam...@collabora.com>

diff --git a/sc/inc/tokenuno.hxx b/sc/inc/tokenuno.hxx
index d025ba0cf44d..b8368688245a 100644
--- a/sc/inc/tokenuno.hxx
+++ b/sc/inc/tokenuno.hxx
@@ -44,7 +44,8 @@ public:
     static SC_DLLPUBLIC void ConvertToTokenSequence(
                         const ScDocument& rDoc,
                         css::uno::Sequence< css::sheet::FormulaToken >& 
rSequence,
-                        const ScTokenArray& rTokenArray );
+                        const ScTokenArray& rTokenArray,
+                        bool bIgnoreTableRefNoInnerReference = false );
 };
 
 class ScFormulaParserObj final : public ::cppu::WeakImplHelper<
diff --git a/sc/source/filter/oox/defnamesbuffer.cxx 
b/sc/source/filter/oox/defnamesbuffer.cxx
index 431ff8a34f35..06a6ec114787 100644
--- a/sc/source/filter/oox/defnamesbuffer.cxx
+++ b/sc/source/filter/oox/defnamesbuffer.cxx
@@ -299,8 +299,11 @@ void DefinedName::convertFormula( const 
css::uno::Sequence<css::sheet::ExternalL
     }
 
     ScTokenArray* pTokenArray = pScRangeData->GetCode();
+    /* TODO: conversion to FormulaToken sequence would be completely
+     * unnecessary if getFormulaParser().extractCellRangeList() could operate
+     * on ScTokenArray instead. */
     Sequence< FormulaToken > aFTokenSeq;
-    ScTokenConversion::ConvertToTokenSequence( getScDocument(), aFTokenSeq, 
*pTokenArray );
+    ScTokenConversion::ConvertToTokenSequence( getScDocument(), aFTokenSeq, 
*pTokenArray, true);
     // set built-in names (print ranges, repeated titles, filter ranges)
     if( isGlobalName() )
         return;
@@ -358,8 +361,11 @@ bool DefinedName::getAbsoluteRange( ScRange& orRange ) 
const
 {
     ScRangeData* pScRangeData = maScRangeData.first;
     ScTokenArray* pTokenArray = pScRangeData->GetCode();
+    /* TODO: conversion to FormulaToken sequence would be completely
+     * unnecessary if getFormulaParser().extractCellRange() could operate
+     * on ScTokenArray instead. */
     Sequence< FormulaToken > aFTokenSeq;
-    ScTokenConversion::ConvertToTokenSequence(getScDocument(), aFTokenSeq, 
*pTokenArray);
+    ScTokenConversion::ConvertToTokenSequence(getScDocument(), aFTokenSeq, 
*pTokenArray, true);
     return getFormulaParser().extractCellRange( orRange, aFTokenSeq );
 }
 
diff --git a/sc/source/ui/unoobj/tokenuno.cxx b/sc/source/ui/unoobj/tokenuno.cxx
index 1f867189687a..51da3621cd4b 100644
--- a/sc/source/ui/unoobj/tokenuno.cxx
+++ b/sc/source/ui/unoobj/tokenuno.cxx
@@ -387,7 +387,8 @@ bool ScTokenConversion::ConvertToTokenArray( ScDocument& 
rDoc,
 }
 
 void ScTokenConversion::ConvertToTokenSequence( const ScDocument& rDoc,
-        uno::Sequence<sheet::FormulaToken>& rSequence, const ScTokenArray& 
rTokenArray )
+        uno::Sequence<sheet::FormulaToken>& rSequence, const ScTokenArray& 
rTokenArray,
+        bool bIgnoreTableRefNoInnerReference )
 {
     sal_Int32 nLen = static_cast<sal_Int32>(rTokenArray.GetLen());
     formula::FormulaToken** pTokens = rTokenArray.GetArray();
@@ -458,7 +459,9 @@ void ScTokenConversion::ConvertToTokenSequence( const 
ScDocument& rDoc,
                             aTableRefToken.Index = static_cast<sal_Int32>( 
pTR->GetIndex());
                             aTableRefToken.Item = static_cast<sal_Int16>( 
pTR->GetItem());
                             const FormulaToken* pRef = pTR->GetAreaRefRPN();
-                            assert(pRef && "something forgot to create RPN for 
ocTableRef inner reference");
+                            assert((pRef || bIgnoreTableRefNoInnerReference)
+                                    && "something forgot to create RPN for 
ocTableRef inner reference");
+                            (void)bIgnoreTableRefNoInnerReference;
                             if (pRef)
                             {
                                 switch (pRef->GetType())

Reply via email to