LegalizeAdulthood added inline comments.

================
Comment at: unittests/ASTMatchers/ASTMatchersTest.cpp:4283
@@ +4282,3 @@
+  EXPECT_TRUE(matches("void f(int i);", functionProtoType()));
+  EXPECT_TRUE(matches("void f();", functionProtoType(parameterCountIs(0))));
+  EXPECT_TRUE(notMatchesC("void f();", functionProtoType()));
----------------
aaron.ballman wrote:
> > I don't understand what would be tested by adding a test for 
> > parameterCountIs() on a function that doesn't have a prototype since it is 
> > a nested matcher passed to functionProtoType() and since the function 
> > doesn't have a prototype, that outer matcher won't match.
> 
> Not according to the AST matcher that was implemented -- it supports 
> FunctionProtoType and FunctionDecl. I want to make sure that if you get to 
> parameterCountIs() through functionDecl() that it doesn't fail.
Ah, OK, you were asking for a test on `functionDecl`, not `functionProtoType`.  
I can do that.  I guess what threw me off is that the comment was attached to 
the prototype tests.
================
Comment at: unittests/ASTMatchers/ASTMatchersTest.cpp:4992
@@ +4991,3 @@
+  EXPECT_TRUE(matches("typedef int hasUnderlyingTypeTest;",
+                      typedefDecl(hasUnderlyingType(asString("int")))));
+  EXPECT_TRUE(matches("typedef const int T;",
----------------
aaron.ballman wrote:
> > I'm happy to make the improvement, but I don't know how. I simply call the 
> > Node.underlyingType(), just like hasType calls Node.getType(). I don't know 
> > why they are different.
> 
> hasType() and hasUnderlyingType() have different operational semantic 
> implications, at least to me. hasType() asks, "ultimately, what is the type 
> of this thing?", and Node.underlyingType() answers that. To me, 
> hasUnderlyingType() asks, "in the chain of types that this typedef refers to, 
> does this thing match any of them?", and Node.underlyingType() does not 
> answer that -- it only looks at the final desugared type. The difference we 
> want is that hasType() continues to look at the final type, but 
> hasUnderlyingType() needs to do more work to look at intermediary types and 
> terminate that loop when the answer is "yes, it has this type" or "no, we 
> can't desugar any further."
> 
> If we don't care about the intermediate types for your needs, then I don't 
> see the point to hasUnderlyingType() being an AST matcher at all. hasType() 
> does exactly what is needed, and you can instead modify that to accept a 
> TypedefDecl in addition to Expr and ValueDecl. However, I still see value in 
> hasUnderlyingType() because typedef chains can be long and complex (like in 
> the Win32 APIs), and being able to query for intermediary types would be 
> useful. e.g., I want to know about all types that have an intermediary type 
> of DWORD (which itself is a typedef for an unsigned integer type). hasType() 
> will always go to the final type, making such a matcher impossible without 
> something like hasUnderlyingType().
I just named the matcher after the 
[accessor](http://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html#a5fccedff6d3854db365a540145029158)
 on a typedefDecl node.  To me it's just a narrowing matcher on that node that 
gives you access to whatever the accessor returns.

Things may have changed in the meantime, but when I originally created this 
patch you couldn't do `typedefDecl(hasType(asString("int")))`.  It doesn't 
compile.  Since `hasType` just matched against the value of whatever 
`Node.getType()` returned it seemed natural to add a matcher called 
`hasUnderlyingType` that just matched against the value of whatever 
`Node.getUnderlyingType()` returned.

As I said, I'm happy to make the suggested improvement, but beyond simple 
immitation of existing matchers, I have no idea how to traverse the encodings 
of types within the guts of clang.  This is what I mean when I say "I don't 
know how".  I understand conceptually what you are saying but I have no idea 
how to express that in clang's code base.


http://reviews.llvm.org/D8149



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to