[cfe-commits] [PATCH] New matcher for MaterializeTemporaryExpression.

Sean Silva silvas at purdue.edu
Mon Aug 20 13:22:59 PDT 2012


I'm not following you.

If a patch doesn't have enough information to uniquely identify the
source file(s) that it refers to, it would be impossible to apply,
defeating the purpose of having a patch in the first place.

--Sean Silva

On Mon, Aug 20, 2012 at 3:58 PM, Manuel Klimek <klimek at google.com> wrote:
> On Mon, Aug 20, 2012 at 12:37 PM, Sean Silva <silvas at purdue.edu> wrote:
>> Phabricator feedback:
>>
>> Would it be possible for the "table of contents" (or somewhere else
>> obvious on the page, like maybe near the diffs) to contain links to
>> the original source code of the file, and not just the diff? I felt
>> myself wanting to browse the whole ASTMatchers.h but in not finding a
>> link in the end I fired up a terminal to look at it.
>
> Unfortunately that's hard in general, because the patch might contain
> arbitrarily small subsets at the end of the real path which we'd need
> to match up with the repo...
>
> Fortunately we have a workaround: uploading patches with a large
> context setting (so that the whole file is included in the uploaded
> diff) fixes the immediate problem, and phab is smart enough to output
> and attach a small-context patch on the review mail.
>
> Cheers,
> /Manuel
>
>>
>> Thanks,
>>
>> --Sean Silva
>>
>> On Mon, Aug 20, 2012 at 2:36 PM, Sam Panzer
>> <reviews at llvm-reviews.chandlerc.com> wrote:
>>> Hi klimek,
>>>
>>> A new matcher which corresponds to the MaterializeTemporaryExpression AST node.
>>>
>>> http://llvm-reviews.chandlerc.com/D20
>>>
>>> Files:
>>>   include/clang/ASTMatchers/ASTMatchers.h
>>>   unittests/ASTMatchers/ASTMatchersTest.cpp
>>>
>>> Index: include/clang/ASTMatchers/ASTMatchers.h
>>> ===================================================================
>>> --- include/clang/ASTMatchers/ASTMatchers.h
>>> +++ include/clang/ASTMatchers/ASTMatchers.h
>>> @@ -473,6 +473,22 @@
>>>    Stmt,
>>>    CXXBindTemporaryExpr> bindTemporaryExpression;
>>>
>>> +/// \brief Matches nodes where temporaries are materialized.
>>> +///
>>> +/// Example: Given
>>> +///   struct T {void func()};
>>> +///   T f();
>>> +///   void g(T);
>>> +/// materializeTempExpr() matches 'f()' in these statements
>>> +///   T u(f());
>>> +///   g(f());
>>> +/// but does not match
>>> +///   f();
>>> +///   f().func();
>>> +const internal::VariadicDynCastAllOfMatcher<
>>> +  Stmt,
>>> +  MaterializeTemporaryExpr> materializeTempExpr;
>>> +
>>>  /// \brief Matches new expressions.
>>>  ///
>>>  /// Given
>>> Index: unittests/ASTMatchers/ASTMatchersTest.cpp
>>> ===================================================================
>>> --- unittests/ASTMatchers/ASTMatchersTest.cpp
>>> +++ unittests/ASTMatchers/ASTMatchersTest.cpp
>>> @@ -1249,6 +1249,43 @@
>>>                   TempExpression));
>>>  }
>>>
>>> +TEST(MaterializeTempExpr, MatchesTemporary) {
>>> +  StatementMatcher MaterializeTemp = materializeTempExpr();
>>> +
>>> +  std::string ClassString =
>>> +      "class string { public: string(); int length(); }; ";
>>> +
>>> +  EXPECT_TRUE(
>>> +      matches(ClassString +
>>> +              "string GetStringByValue();"
>>> +              "void FunctionTakesString(string s);"
>>> +              "void run() { FunctionTakesString(GetStringByValue()); }",
>>> +              MaterializeTemp));
>>> +
>>> +  EXPECT_TRUE(
>>> +      notMatches(ClassString +
>>> +                 "string* GetStringPointer(); "
>>> +                 "void FunctionTakesStringPtr(string* s);"
>>> +                 "void run() {"
>>> +                 "  string* s = GetStringPointer();"
>>> +                 "  FunctionTakesStringPtr(GetStringPointer());"
>>> +                 "  FunctionTakesStringPtr(s);"
>>> +                 "}",
>>> +                 MaterializeTemp));
>>> +
>>> +  EXPECT_TRUE(
>>> +      notMatches(ClassString +
>>> +                 "string GetStringByValue();"
>>> +                 "void run() { int k = GetStringByValue().length(); }",
>>> +                 MaterializeTemp));
>>> +
>>> +  EXPECT_TRUE(
>>> +      notMatches(ClassString +
>>> +                 "string GetStringByValue();"
>>> +                 "void run() { GetStringByValue(); }",
>>> +                 MaterializeTemp));
>>> +}
>>> +
>>>  TEST(ConstructorDeclaration, SimpleCase) {
>>>    EXPECT_TRUE(matches("class Foo { Foo(int i); };",
>>>                        constructor(ofClass(hasName("Foo")))));
>>>
>>> _______________________________________________
>>> cfe-commits mailing list
>>> cfe-commits at cs.uiuc.edu
>>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>>>



More information about the cfe-commits mailing list