r339730 - Fix Stmt::ignoreImplicit

Stephen Kelly via llvm-commits llvm-commits at lists.llvm.org
Wed Aug 15 05:05:09 PDT 2018


I tried on godbolt and your example works with GCC 4.9 and later.

https://godbolt.org/beta/z/MjE4ZT

Something else may have been wrong in addition.

Thanks,

Stephen.



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

> Anything before GCC 8 I believe (although I found the error with GCC 4.9).
> It incorrectly turns code like this:
>
> void func(const char *);
> #define MACRO(X) func(#X)
> MACRO(R"(Hello
> this is a string)");
>
>
> with -E into:
>
> func("R\"(Hello
> this is a string)\""
>  );
>
>
> GCC 8 (and clang) get it right by changing it to:
>
> func("R\"(Hello\nthis is a string)\"")
>
>
> Dave
>
>
>
> From: Stephen Kelly <steveire at gmail.com>
> Sent: 15 August 2018 12:31
> To: David Green
> Cc: llvm-commits; nd
> Subject: Re: r339730 - Fix Stmt::ignoreImplicit
>
> 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<mailto:
> 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<mailto:
> cfe-commits-bounces at lists.llvm.org>> on behalf of Stephen Kelly via
> cfe-commits <cfe-commits at lists.llvm.org<mailto:cfe-commits at lists.llvm.org
> >>
> Sent: 14 August 2018 22:33:28
> To: cfe-commits at lists.llvm.org<mailto: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<mailto: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/0da09d0f/attachment.html>


More information about the llvm-commits mailing list