diff options
author | Stephan Bergmann <sbergman@redhat.com> | 2017-07-03 10:33:13 +0200 |
---|---|---|
committer | Stephan Bergmann <sbergman@redhat.com> | 2017-07-03 10:33:13 +0200 |
commit | 33ee8e61292af05627f5f72ea2f93ad80e715e46 (patch) | |
tree | 93caab95248600e1463fa765274cb5b870bb0eb7 /compilerplugins | |
parent | a5c200bddd51cba75d30f37a33541778ba8223b4 (diff) |
Work around bug in Clang 3.8
...that causes
> clang/lib/AST/Type.cpp:1878: bool clang::Type::isConstantSizeType() const: Assertion `!isDependentType() && "This doesn't make sense for dependent types"' failed.
compilation failure in PCodeBufferWalker in basic/source/comp/codegen.cxx
> static T readParam( sal_uInt8 const *& pCode )
> {
> short nBytes = sizeof( T );
> T nOp1=0;
> for ( int i=0; i<nBytes; ++i )
> nOp1 |= *pCode++ << ( i * 8);
> return nOp1;
> }
with loplugin:oncevar.
Change-Id: I25417076549ea538adf013282f3657e0d642d776
Diffstat (limited to 'compilerplugins')
-rw-r--r-- | compilerplugins/clang/oncevar.cxx | 24 |
1 files changed, 20 insertions, 4 deletions
diff --git a/compilerplugins/clang/oncevar.cxx b/compilerplugins/clang/oncevar.cxx index 1fa6cd53acf0..41feb23b3280 100644 --- a/compilerplugins/clang/oncevar.cxx +++ b/compilerplugins/clang/oncevar.cxx @@ -162,10 +162,26 @@ bool OnceVar::VisitVarDecl( const VarDecl* varDecl ) } } } - if (!foundStringLiteral - && !varDecl->getInit()->isConstantInitializer(compiler.getASTContext(), false/*ForRef*/)) - { - return true; + if (!foundStringLiteral) { + auto const init = varDecl->getInit(); +#if CLANG_VERSION < 30900 + // Work around missing Clang 3.9 fix <https://reviews.llvm.org/rL271762> + // "Sema: do not attempt to sizeof a dependent type" (while an + // initializer expression of the form + // + // sizeof (T) + // + // with dependent type T /is/ constant, keep consistent here with the + // (arguably broken) behavior of isConstantInitalizer returning false in + // Clang >= 3.9): + if (init->isValueDependent()) { + return true; + } +#endif + if (!init->isConstantInitializer(compiler.getASTContext(), false/*ForRef*/)) + { + return true; + } } maVarDeclSet.insert(varDecl); |