[Libreoffice-commits] core.git: compilerplugins/clang

Stephan Bergmann sbergman at redhat.com
Tue Jan 10 13:49:41 UTC 2017


 compilerplugins/clang/conststringvar.cxx |    4 ++++
 1 file changed, 4 insertions(+)

New commits:
commit 629765804a9d416c022697c1d0ae9493127d3efe
Author: Stephan Bergmann <sbergman at redhat.com>
Date:   Tue Jan 10 14:35:05 2017 +0100

    Work around problems with isCXX11ConstantExpr in template code
    
    > template<size_t Size>
    > bool checkOutput(ScDocument* pDoc, const ScRange& aOutRange, const char* aOutputCheck[][Size], const char* pCaption)
    > {
    >     ...
    >             const char* p = aOutputCheck[nRow][nCol];
    
    in sc/qa/unit/helper/qahelper.hxx caused
    
    >    assert(E->isRValue() && E->getType()->hasPointerRepresentation());
    
    in Clang's EvaluatePointer (lib/AST/ExprConstant.cpp) to fire.  In the template
    definition itself, Clang doesn't introduce ArrayToPointerDecay ImplicitCastExpr
    into the subscripting operations (while in any implicit specializations that it
    instantiates, it does).
    
    This is interesting:  Up to C++11, [expr.sub] requires the operator to have
    pointer type (so array-to-pointer decay is clearly asked for).  In C++14
    (CWG1213), the operator can also be of array type but it is not explicitly
    specified whether array-to-pointer decay is to be performed.  In upcoming C++17
    (P0135R1), it specifies further that an operator of array type must be a glvalue
    but still does not explicitly specify whether array-to-pointer decay is to be
    performed.  Maybe the definition of the subscripting operation in terms of
    *((E1)+(E2)) is meant to imply that, however.
    
    Change-Id: I67c7b0f34002387dbf746288630371877c6261ef

diff --git a/compilerplugins/clang/conststringvar.cxx b/compilerplugins/clang/conststringvar.cxx
index 58a94e5..a6d348a 100644
--- a/compilerplugins/clang/conststringvar.cxx
+++ b/compilerplugins/clang/conststringvar.cxx
@@ -104,6 +104,10 @@ public:
         if (init == nullptr) {
             return true;
         }
+        if (init->isInstantiationDependent()) {
+            // avoid problems with isCXX11ConstantExpr in template code
+            return true;
+        }
         APValue v;
         if (!init->isCXX11ConstantExpr(compiler.getASTContext(), &v)) {
             return true;


More information about the Libreoffice-commits mailing list