================
Comment at: include/clang/ASTMatchers/ASTMatchers.h:2970-2982
@@ -2969,1 +2969,15 @@
 
+/// \brief Matches declarations or statements that are contained in a function
+/// or class template instantiation.
+///
+/// Given
+/// \code
+///   template<typename T> void A(T t) { T i; }
+///   A(0);
+///   A(0U);
+/// \endcode
+/// stmt(isInTemplateInstantiation())
+///   matches 'int i;' and 'unsigned i;'.
+///
+/// Usable as: Matcher<Decl>, Matcher<Stmt>
+AST_POLYMORPHIC_MATCHER(isInTemplateInstantiation,
----------------
Perhaps add comment that this will not match if the node itself is a template 
instantiation (so functionDecl(isInTemplateInstantiation()) will not match 
anything here).

I'd also add a comment about node sharing; for example, given
int j;
template<typename T> void A(T t) { T i; j += 42; int x; }
  stmt(unless(isInTemplateInstnatiation()))
will not match j += 42 (because the template independent node is shared between 
the definition and the instantiations), but will match 'T i;' (with the 
dependent type), because the dependent nodes cannot be shared.
Funnily enough 'int x' *will* match (as will any further statement referencing 
x); I have no idea why the node cannot be shared, which is why node sharing 
always makes me feel cautious.

Of course:
  stmt(isInTemplateInstnatiation())
will match all.


================
Comment at: include/clang/ASTMatchers/ASTMatchers.h:2980
@@ +2979,3 @@
+/// stmt(isInTemplateInstantiation())
+///   matches 'int i;' and 'unsigned i;'.
+///
----------------
Also matches the block '{ T i; }'.

http://reviews.llvm.org/D5085



_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to