JonasToth created this revision. JonasToth added reviewers: aaron.ballman, alexfh, klimek. Herald added a subscriber: cfe-commits.
The new matchers can be used to check if an expression is type- or value-dependent in a templated context. These matchers are used in a clang-tidy check and generally useful as the problem of unresolved templates occurs more often in clang-tidy and they provide an easy way to check for this issue. Repository: rC Clang https://reviews.llvm.org/D51880 Files: docs/LibASTMatchersReference.html include/clang/ASTMatchers/ASTMatchers.h Index: include/clang/ASTMatchers/ASTMatchers.h =================================================================== --- include/clang/ASTMatchers/ASTMatchers.h +++ include/clang/ASTMatchers/ASTMatchers.h @@ -774,6 +774,29 @@ return InnerMatcher.matches(*Node.IgnoreParenCasts(), Finder, Builder); } +/// Matches expressions that are type-dependant because the template type +/// is not yet instantiated. +/// +/// For example, the expressions "x" and "x + y" are type-dependent in +/// the following code, but "y" is not type-dependent: +/// \code +/// template<typename T> +/// void add(T x, int y) { +/// x + y; +/// } +/// \endcode +AST_MATCHER(Expr, isTypeDependent) { return Node.isTypeDependent(); } + +/// Matches expression that are value-dependant because they contain a +/// non-type template parameter. +/// +/// For example, the array bound of "Chars" in the following example is +/// value-dependent. +/// \code +/// template<int Size, char (&Chars)[Size]> struct meta_string; +/// \endcode +AST_MATCHER(Expr, isValueDependent) { return Node.isValueDependent(); } + /// Matches expressions that match InnerMatcher after implicit casts and /// parentheses are stripped off. /// Index: docs/LibASTMatchersReference.html =================================================================== --- docs/LibASTMatchersReference.html +++ docs/LibASTMatchersReference.html @@ -2758,6 +2758,29 @@ </pre></td></tr> +<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>></td><td class="name" onclick="toggle('isTypeDependent0')"><a name="isTypeDependent0Anchor">isTypeDependent</a></td><td></td></tr> +<tr><td colspan="4" class="doc" id="isTypeDependent0"><pre>Matches expressions that are type-dependant because the template type +is not yet instantiated. + +For example, the expressions "x" and "x + y" are type-dependent in +the following code, but "y" is not type-dependent: + template<typename T> + void add(T x, int y) { + x + y; + } +</pre></td></tr> + + +<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>></td><td class="name" onclick="toggle('isValueDependent0')"><a name="isValueDependent0Anchor">isValueDependent</a></td><td></td></tr> +<tr><td colspan="4" class="doc" id="isValueDependent0"><pre>Matches expression that are value-dependant because they contain a +non-type template parameter. + +For example, the array bound of "Chars" in the following example is +value-dependent. + template<int Size, char (&Chars)[Size]> struct meta_string; +</pre></td></tr> + + <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>></td><td class="name" onclick="toggle('hasBitWidth0')"><a name="hasBitWidth0Anchor">hasBitWidth</a></td><td>unsigned Width</td></tr> <tr><td colspan="4" class="doc" id="hasBitWidth0"><pre>Matches non-static data members that are bit-fields of the specified bit width.
Index: include/clang/ASTMatchers/ASTMatchers.h =================================================================== --- include/clang/ASTMatchers/ASTMatchers.h +++ include/clang/ASTMatchers/ASTMatchers.h @@ -774,6 +774,29 @@ return InnerMatcher.matches(*Node.IgnoreParenCasts(), Finder, Builder); } +/// Matches expressions that are type-dependant because the template type +/// is not yet instantiated. +/// +/// For example, the expressions "x" and "x + y" are type-dependent in +/// the following code, but "y" is not type-dependent: +/// \code +/// template<typename T> +/// void add(T x, int y) { +/// x + y; +/// } +/// \endcode +AST_MATCHER(Expr, isTypeDependent) { return Node.isTypeDependent(); } + +/// Matches expression that are value-dependant because they contain a +/// non-type template parameter. +/// +/// For example, the array bound of "Chars" in the following example is +/// value-dependent. +/// \code +/// template<int Size, char (&Chars)[Size]> struct meta_string; +/// \endcode +AST_MATCHER(Expr, isValueDependent) { return Node.isValueDependent(); } + /// Matches expressions that match InnerMatcher after implicit casts and /// parentheses are stripped off. /// Index: docs/LibASTMatchersReference.html =================================================================== --- docs/LibASTMatchersReference.html +++ docs/LibASTMatchersReference.html @@ -2758,6 +2758,29 @@ </pre></td></tr> +<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>></td><td class="name" onclick="toggle('isTypeDependent0')"><a name="isTypeDependent0Anchor">isTypeDependent</a></td><td></td></tr> +<tr><td colspan="4" class="doc" id="isTypeDependent0"><pre>Matches expressions that are type-dependant because the template type +is not yet instantiated. + +For example, the expressions "x" and "x + y" are type-dependent in +the following code, but "y" is not type-dependent: + template<typename T> + void add(T x, int y) { + x + y; + } +</pre></td></tr> + + +<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>></td><td class="name" onclick="toggle('isValueDependent0')"><a name="isValueDependent0Anchor">isValueDependent</a></td><td></td></tr> +<tr><td colspan="4" class="doc" id="isValueDependent0"><pre>Matches expression that are value-dependant because they contain a +non-type template parameter. + +For example, the array bound of "Chars" in the following example is +value-dependent. + template<int Size, char (&Chars)[Size]> struct meta_string; +</pre></td></tr> + + <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>></td><td class="name" onclick="toggle('hasBitWidth0')"><a name="hasBitWidth0Anchor">hasBitWidth</a></td><td>unsigned Width</td></tr> <tr><td colspan="4" class="doc" id="hasBitWidth0"><pre>Matches non-static data members that are bit-fields of the specified bit width.
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits