[clang][ASTMatcher] Add Matcher 'dependentSizedExtVectorType'

Add Matcher dependentSizedExtVectorType for DependentSizedExtVectorType.

Reviewed By: aaron.ballman

Differential Revision: https://reviews.llvm.org/D157237
This commit is contained in:
dingfei 2023-08-07 21:48:28 +08:00
parent 0726cb0047
commit 4cce27d918
6 changed files with 45 additions and 0 deletions

View File

@ -2531,6 +2531,19 @@ dependentSizedArrayType
</pre></td></tr>
<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('dependentSizedExtVectorType')"><a name="dependentSizedExtVectorType0Anchor">dependentSizedExtVectorType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DependentSizedExtVectorType.html">DependentSizedExtVectorType</a>&gt;...</td></tr>
<tr><td colspan="4" class="doc" id="dependentSizedExtVectorType0"><pre>Matches C++ extended vector type where either the type or size is dependent.
Given
template&lt;typename T, int Size&gt;
class vector {
typedef T __attribute__((ext_vector_type(Size))) type;
};
dependentSizedExtVectorType
matches "T __attribute__((ext_vector_type(Size)))"
</pre></td></tr>
<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('elaboratedType0')"><a name="elaboratedType0Anchor">elaboratedType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ElaboratedType.html">ElaboratedType</a>&gt;...</td></tr>
<tr><td colspan="4" class="doc" id="elaboratedType0"><pre>Matches types specified with an elaborated type keyword or with a
qualified name.

View File

@ -231,6 +231,7 @@ Floating Point Support in Clang
AST Matchers
------------
- Add ``dependentSizedExtVectorType``.
clang-format
------------

View File

@ -6938,6 +6938,21 @@ AST_POLYMORPHIC_MATCHER_P(hasSize,
/// matches "T data[Size]"
extern const AstTypeMatcher<DependentSizedArrayType> dependentSizedArrayType;
/// Matches C++ extended vector type where either the type or size is
/// dependent.
///
/// Given
/// \code
/// template<typename T, int Size>
/// class vector {
/// typedef T __attribute__((ext_vector_type(Size))) type;
/// };
/// \endcode
/// dependentSizedExtVectorType
/// matches "T __attribute__((ext_vector_type(Size)))"
extern const AstTypeMatcher<DependentSizedExtVectorType>
dependentSizedExtVectorType;
/// Matches C arrays with unspecified size.
///
/// Given

View File

@ -1046,6 +1046,7 @@ const AstTypeMatcher<ConstantArrayType> constantArrayType;
const AstTypeMatcher<DeducedTemplateSpecializationType>
deducedTemplateSpecializationType;
const AstTypeMatcher<DependentSizedArrayType> dependentSizedArrayType;
const AstTypeMatcher<DependentSizedExtVectorType> dependentSizedExtVectorType;
const AstTypeMatcher<IncompleteArrayType> incompleteArrayType;
const AstTypeMatcher<VariableArrayType> variableArrayType;
const AstTypeMatcher<AtomicType> atomicType;

View File

@ -227,6 +227,7 @@ RegistryMaps::RegistryMaps() {
REGISTER_MATCHER(defaultStmt);
REGISTER_MATCHER(dependentCoawaitExpr);
REGISTER_MATCHER(dependentSizedArrayType);
REGISTER_MATCHER(dependentSizedExtVectorType);
REGISTER_MATCHER(designatedInitExpr);
REGISTER_MATCHER(designatorCountIs);
REGISTER_MATCHER(doStmt);

View File

@ -1560,6 +1560,20 @@ TEST_P(ASTMatchersTest, DependentSizedArrayType) {
dependentSizedArrayType()));
}
TEST_P(ASTMatchersTest, DependentSizedExtVectorType) {
if (!GetParam().isCXX()) {
return;
}
EXPECT_TRUE(matches("template<typename T, int Size>"
"class vector {"
" typedef T __attribute__((ext_vector_type(Size))) type;"
"};",
dependentSizedExtVectorType()));
EXPECT_TRUE(
notMatches("int a[42]; int b[] = { 2, 3 }; void f() { int c[b[0]]; }",
dependentSizedExtVectorType()));
}
TEST_P(ASTMatchersTest, IncompleteArrayType) {
EXPECT_TRUE(matches("int a[] = { 2, 3 };", incompleteArrayType()));
EXPECT_TRUE(matches("void f(int a[]) {}", incompleteArrayType()));