r339730 - Fix Stmt::ignoreImplicit

Stephen Kelly via llvm-commits llvm-commits at lists.llvm.org
Wed Aug 15 04:31:12 PDT 2018


Great, thanks for that!

Can you say what version of GCC is affected?

Thanks,

Stephen.

On Wed, 15 Aug 2018, 11:44 David Green, <David.Green at arm.com> wrote:

> Hello
>
> Some version of GCC don't like raw string literals inside macro's.
>
> I've put up https://reviews.llvm.org/rL339759 as a fix. Let me know if it
> looks iffy.
>
> Cheers
> Dave
>
> ________________________________________
> From: cfe-commits <cfe-commits-bounces at lists.llvm.org> on behalf of
> Stephen Kelly via cfe-commits <cfe-commits at lists.llvm.org>
> Sent: 14 August 2018 22:33:28
> To: cfe-commits at lists.llvm.org
> Subject: r339730 - Fix Stmt::ignoreImplicit
>
> Author: steveire
> Date: Tue Aug 14 14:33:28 2018
> New Revision: 339730
>
> URL: http://llvm.org/viewvc/llvm-project?rev=339730&view=rev
> Log:
> Fix Stmt::ignoreImplicit
>
> Summary:
> A CXXBindTemporaryExpr can appear inside an ImplicitCastExpr, and was
> not ignored previously.
>
> Fixes the case reported in PR37327.
>
> Reviewers: rsmith, dblaikie, klimek
>
> Subscribers: cfe-commits
>
> Differential Revision: https://reviews.llvm.org/D50666
>
> Modified:
>     cfe/trunk/lib/AST/Stmt.cpp
>     cfe/trunk/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp
>
> Modified: cfe/trunk/lib/AST/Stmt.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/Stmt.cpp?rev=339730&r1=339729&r2=339730&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/AST/Stmt.cpp (original)
> +++ cfe/trunk/lib/AST/Stmt.cpp Tue Aug 14 14:33:28 2018
> @@ -113,17 +113,23 @@ void Stmt::EnableStatistics() {
>  Stmt *Stmt::IgnoreImplicit() {
>    Stmt *s = this;
>
> -  if (auto *ewc = dyn_cast<ExprWithCleanups>(s))
> -    s = ewc->getSubExpr();
> +  Stmt *lasts = nullptr;
>
> -  if (auto *mte = dyn_cast<MaterializeTemporaryExpr>(s))
> -    s = mte->GetTemporaryExpr();
> +  while (s != lasts) {
> +    lasts = s;
>
> -  if (auto *bte = dyn_cast<CXXBindTemporaryExpr>(s))
> -    s = bte->getSubExpr();
> +    if (auto *ewc = dyn_cast<ExprWithCleanups>(s))
> +      s = ewc->getSubExpr();
>
> -  while (auto *ice = dyn_cast<ImplicitCastExpr>(s))
> -    s = ice->getSubExpr();
> +    if (auto *mte = dyn_cast<MaterializeTemporaryExpr>(s))
> +      s = mte->GetTemporaryExpr();
> +
> +    if (auto *bte = dyn_cast<CXXBindTemporaryExpr>(s))
> +      s = bte->getSubExpr();
> +
> +    if (auto *ice = dyn_cast<ImplicitCastExpr>(s))
> +      s = ice->getSubExpr();
> +  }
>
>    return s;
>  }
>
> Modified: cfe/trunk/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp?rev=339730&r1=339729&r2=339730&view=diff
>
> ==============================================================================
> --- cfe/trunk/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp (original)
> +++ cfe/trunk/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp Tue Aug
> 14 14:33:28 2018
> @@ -1321,6 +1321,45 @@ TEST(IgnoringImplicit, MatchesImplicit)
>
>  varDecl(has(ignoringImplicit(cxxConstructExpr())))));
>  }
>
> +TEST(IgnoringImplicit, MatchesNestedImplicit) {
> +  EXPECT_TRUE(matches(R"(
> +
> +struct OtherType;
> +
> +struct SomeType
> +{
> +    SomeType() {}
> +    SomeType(const OtherType&) {}
> +    SomeType& operator=(OtherType const&) { return *this; }
> +};
> +
> +struct OtherType
> +{
> +    OtherType() {}
> +    ~OtherType() {}
> +};
> +
> +OtherType something()
> +{
> +    return {};
> +}
> +
> +int main()
> +{
> +    SomeType i = something();
> +}
> +)"
> +  , varDecl(
> +      hasName("i"),
> +      hasInitializer(exprWithCleanups(has(
> +        cxxConstructExpr(has(expr(ignoringImplicit(cxxConstructExpr(
> +          has(expr(ignoringImplicit(callExpr())))
> +          )))))
> +        )))
> +      )
> +  ));
> +}
> +
>  TEST(IgnoringImplicit, DoesNotMatchIncorrectly) {
>    EXPECT_TRUE(
>        notMatches("class C {}; C a = C();",
> varDecl(has(cxxConstructExpr()))));
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180815/720dd690/attachment.html>


More information about the llvm-commits mailing list