[clang-tools-extra] 7844366 - [OpenMP] Add firstprivate as a default data-sharing attribute to clang
Johannes Doerfert via cfe-commits
cfe-commits at lists.llvm.org
Sun Jul 12 21:03:56 PDT 2020
Author: Atmn Patel
Date: 2020-07-12T23:01:40-05:00
New Revision: 78443666bc18a6957d279a0f58319c8a3e57771a
URL: https://github.com/llvm/llvm-project/commit/78443666bc18a6957d279a0f58319c8a3e57771a
DIFF: https://github.com/llvm/llvm-project/commit/78443666bc18a6957d279a0f58319c8a3e57771a.diff
LOG: [OpenMP] Add firstprivate as a default data-sharing attribute to clang
This implements the default(firstprivate) clause as defined in OpenMP
Technical Report 8 (2.22.4).
Reviewed By: jdoerfert, ABataev
Differential Revision: https://reviews.llvm.org/D75591
Added:
Modified:
clang-tools-extra/docs/clang-tidy/checks/openmp-use-default-none.rst
clang-tools-extra/test/clang-tidy/checkers/openmp-use-default-none.cpp
clang/docs/LibASTMatchersReference.html
clang/include/clang/ASTMatchers/ASTMatchers.h
clang/include/clang/Basic/DiagnosticParseKinds.td
clang/lib/ASTMatchers/Dynamic/Registry.cpp
clang/lib/Parse/ParseOpenMP.cpp
clang/lib/Sema/SemaOpenMP.cpp
clang/test/OpenMP/distribute_parallel_for_default_messages.cpp
clang/test/OpenMP/distribute_parallel_for_simd_default_messages.cpp
clang/test/OpenMP/driver.c
clang/test/OpenMP/parallel_default_messages.cpp
clang/test/OpenMP/parallel_for_default_messages.cpp
clang/test/OpenMP/parallel_for_simd_default_messages.cpp
clang/test/OpenMP/parallel_master_codegen.cpp
clang/test/OpenMP/parallel_master_default_messages.cpp
clang/test/OpenMP/parallel_sections_default_messages.cpp
clang/test/OpenMP/target_parallel_default_messages.cpp
clang/test/OpenMP/target_parallel_for_default_messages.cpp
clang/test/OpenMP/target_parallel_for_simd_default_messages.cpp
clang/test/OpenMP/target_teams_default_messages.cpp
clang/test/OpenMP/target_teams_distribute_default_messages.cpp
clang/test/OpenMP/target_teams_distribute_parallel_for_default_messages.cpp
clang/test/OpenMP/target_teams_distribute_parallel_for_simd_default_messages.cpp
clang/test/OpenMP/task_default_messages.cpp
clang/test/OpenMP/task_messages.cpp
clang/test/OpenMP/teams_default_messages.cpp
clang/test/OpenMP/teams_distribute_default_messages.cpp
clang/test/OpenMP/teams_distribute_parallel_for_default_messages.cpp
clang/test/OpenMP/teams_distribute_parallel_for_simd_default_messages.cpp
clang/test/OpenMP/teams_distribute_simd_default_messages.cpp
clang/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp
clang/unittests/ASTMatchers/ASTMatchersNodeTest.cpp
clang/unittests/ASTMatchers/ASTMatchersTest.h
llvm/include/llvm/Frontend/OpenMP/OMPKinds.def
Removed:
################################################################################
diff --git a/clang-tools-extra/docs/clang-tidy/checks/openmp-use-default-none.rst b/clang-tools-extra/docs/clang-tidy/checks/openmp-use-default-none.rst
index 4223a10bd6e9..77114100ba1c 100644
--- a/clang-tools-extra/docs/clang-tidy/checks/openmp-use-default-none.rst
+++ b/clang-tools-extra/docs/clang-tidy/checks/openmp-use-default-none.rst
@@ -51,3 +51,12 @@ Example
// WARNING: OpenMP directive ``parallel`` specifies ``default(shared)``
// clause. Consider using ``default(none)`` clause instead.
}
+
+ // ``parallel`` directive can have ``default`` clause, and said clause is
+ // specified, but with ``firstprivate`` kind, which is not ``none``, diagnose.
+ void p0_3() {
+ #pragma omp parallel default(firstprivate)
+ ;
+ // WARNING: OpenMP directive ``parallel`` specifies ``default(firstprivate)``
+ // clause. Consider using ``default(none)`` clause instead.
+ }
diff --git a/clang-tools-extra/test/clang-tidy/checkers/openmp-use-default-none.cpp b/clang-tools-extra/test/clang-tidy/checkers/openmp-use-default-none.cpp
index 35d2d17b1e0e..d1d3b0e441f3 100644
--- a/clang-tools-extra/test/clang-tidy/checkers/openmp-use-default-none.cpp
+++ b/clang-tools-extra/test/clang-tidy/checkers/openmp-use-default-none.cpp
@@ -1,5 +1,5 @@
-// RUN: %check_clang_tidy %s openmp-use-default-none %t -- -- -fopenmp=libomp -fopenmp-version=40
-// RUN: %check_clang_tidy -std=c11 %s openmp-use-default-none %t -- -- -x c -fopenmp=libomp -fopenmp-version=40
+// RUN: %check_clang_tidy %s openmp-use-default-none %t -- -- -fopenmp=libomp -fopenmp-version=51
+// RUN: %check_clang_tidy -std=c11 %s openmp-use-default-none %t -- -- -x c -fopenmp=libomp -fopenmp-version=51
//----------------------------------------------------------------------------//
// Null cases.
@@ -42,6 +42,15 @@ void p0_2() {
// CHECK-NOTES: :[[@LINE-3]]:22: note: existing 'default' clause specified here
}
+// 'parallel' directive can have 'default' clause, and said clause specified,
+// but with 'firstprivate' kind, which is not 'none', diagnose.
+void p0_3() {
+#pragma omp parallel default(firstprivate)
+ ;
+ // CHECK-NOTES: :[[@LINE-2]]:1: warning: OpenMP directive 'parallel' specifies 'default(firstprivate)' clause, consider using 'default(none)' clause instead
+ // CHECK-NOTES: :[[@LINE-3]]:22: note: existing 'default' clause specified here
+}
+
// 'task' directive.
// 'task' directive can have 'default' clause, but said clause is not
@@ -68,6 +77,15 @@ void p1_2() {
// CHECK-NOTES: :[[@LINE-3]]:18: note: existing 'default' clause specified here
}
+// 'task' directive can have 'default' clause, and said clause specified,
+// but with 'firstprivate' kind, which is not 'none', diagnose.
+void p1_3() {
+#pragma omp task default(firstprivate)
+ ;
+ // CHECK-NOTES: :[[@LINE-2]]:1: warning: OpenMP directive 'task' specifies 'default(firstprivate)' clause, consider using 'default(none)' clause instead
+ // CHECK-NOTES: :[[@LINE-3]]:18: note: existing 'default' clause specified here
+}
+
// 'teams' directive. (has to be inside of 'target' directive)
// 'teams' directive can have 'default' clause, but said clause is not
@@ -97,6 +115,16 @@ void p2_2() {
// CHECK-NOTES: :[[@LINE-3]]:19: note: existing 'default' clause specified here
}
+// 'teams' directive can have 'default' clause, and said clause specified,
+// but with 'firstprivate' kind, which is not 'none', diagnose.
+void p2_3() {
+#pragma omp target
+#pragma omp teams default(firstprivate)
+ ;
+ // CHECK-NOTES: :[[@LINE-2]]:1: warning: OpenMP directive 'teams' specifies 'default(firstprivate)' clause, consider using 'default(none)' clause instead
+ // CHECK-NOTES: :[[@LINE-3]]:19: note: existing 'default' clause specified here
+}
+
// 'taskloop' directive.
// 'taskloop' directive can have 'default' clause, but said clause is not
@@ -126,6 +154,16 @@ void p3_2(const int a) {
// CHECK-NOTES: :[[@LINE-4]]:22: note: existing 'default' clause specified here
}
+// 'taskloop' directive can have 'default' clause, and said clause specified,
+// but with 'firstprivate' kind, which is not 'none', diagnose.
+void p3_3(const int a) {
+#pragma omp taskloop default(firstprivate)
+ for (int b = 0; b < a; b++)
+ ;
+ // CHECK-NOTES: :[[@LINE-3]]:1: warning: OpenMP directive 'taskloop' specifies 'default(firstprivate)' clause, consider using 'default(none)' clause instead
+ // CHECK-NOTES: :[[@LINE-4]]:22: note: existing 'default' clause specified here
+}
+
//----------------------------------------------------------------------------//
// Combined directives.
// Let's not test every single possible permutation/combination of directives,
@@ -158,3 +196,13 @@ void p4_2(const int a) {
// CHECK-NOTES: :[[@LINE-3]]:1: warning: OpenMP directive 'parallel for' specifies 'default(shared)' clause, consider using 'default(none)' clause instead
// CHECK-NOTES: :[[@LINE-4]]:26: note: existing 'default' clause specified here
}
+
+// 'parallel' directive can have 'default' clause, and said clause specified,
+// but with 'firstprivate' kind, which is not 'none', diagnose.
+void p4_3(const int a) {
+#pragma omp parallel for default(firstprivate)
+ for (int b = 0; b < a; b++)
+ ;
+ // CHECK-NOTES: :[[@LINE-3]]:1: warning: OpenMP directive 'parallel for' specifies 'default(firstprivate)' clause, consider using 'default(none)' clause instead
+ // CHECK-NOTES: :[[@LINE-4]]:26: note: existing 'default' clause specified here
+}
diff --git a/clang/docs/LibASTMatchersReference.html b/clang/docs/LibASTMatchersReference.html
index 2256cbf71869..60ff6ffe6056 100644
--- a/clang/docs/LibASTMatchersReference.html
+++ b/clang/docs/LibASTMatchersReference.html
@@ -676,9 +676,10 @@ <h2 id="decl-matchers">Node Matchers</h2>
#pragma omp parallel default(none)
#pragma omp parallel default(shared)
+ #pragma omp parallel default(firstprivate)
#pragma omp parallel
-``ompDefaultClause()`` matches ``default(none)`` and ``default(shared)``.
+``ompDefaultClause()`` matches ``default(none)``, ``default(shared)``, and ``default(firstprivate)``.
</pre></td></tr>
@@ -3783,6 +3784,7 @@ <h2 id="narrowing-matchers">Narrowing Matchers</h2>
#pragma omp parallel
#pragma omp parallel default(none)
#pragma omp parallel default(shared)
+ #pragma omp parallel default(firstprivate)
``ompDefaultClause(isNoneKind())`` matches only ``default(none)``.
</pre></td></tr>
@@ -3796,11 +3798,26 @@ <h2 id="narrowing-matchers">Narrowing Matchers</h2>
#pragma omp parallel
#pragma omp parallel default(none)
#pragma omp parallel default(shared)
+ #pragma omp parallel default(firstprivate)
``ompDefaultClause(isSharedKind())`` matches only ``default(shared)``.
</pre></td></tr>
+<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPDefaultClause.html">OMPDefaultClause</a>></td><td class="name" onclick="toggle('isFirstPrivateKind0')"><a name="isFirstPrivateKind0Anchor">isSharedKind</a></td><td></td></tr>
+<tr><td colspan="4" class="doc" id="isFirstPrivateKind0"><pre>Matches if the OpenMP ``default`` clause has ``firstprivate`` kind specified.
+
+Given
+
+ #pragma omp parallel
+ #pragma omp parallel default(none)
+ #pragma omp parallel default(shared)
+ #pragma omp parallel default(firstprivate)
+
+``ompDefaultClause(isFirstPrivateKind())`` matches only ``default(firstprivate)``.
+</pre></td></tr>
+
+
<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPExecutableDirective.html">OMPExecutableDirective</a>></td><td class="name" onclick="toggle('isAllowedToContainClauseKind0')"><a name="isAllowedToContainClauseKind0Anchor">isAllowedToContainClauseKind</a></td><td>OpenMPClauseKind CKind</td></tr>
<tr><td colspan="4" class="doc" id="isAllowedToContainClauseKind0"><pre>Matches if the OpenMP directive is allowed to contain the specified OpenMP
clause kind.
diff --git a/clang/include/clang/ASTMatchers/ASTMatchers.h b/clang/include/clang/ASTMatchers/ASTMatchers.h
index f16fb876cdd3..643419743a11 100644
--- a/clang/include/clang/ASTMatchers/ASTMatchers.h
+++ b/clang/include/clang/ASTMatchers/ASTMatchers.h
@@ -7190,10 +7190,12 @@ AST_MATCHER_P(OMPExecutableDirective, hasAnyClause,
/// \code
/// #pragma omp parallel default(none)
/// #pragma omp parallel default(shared)
+/// #pragma omp parallel default(firstprivate)
/// #pragma omp parallel
/// \endcode
///
-/// ``ompDefaultClause()`` matches ``default(none)`` and ``default(shared)``.
+/// ``ompDefaultClause()`` matches ``default(none)``, ``default(shared)``, and
+/// ``default(firstprivate)``
extern const internal::VariadicDynCastAllOfMatcher<OMPClause, OMPDefaultClause>
ompDefaultClause;
@@ -7205,6 +7207,7 @@ extern const internal::VariadicDynCastAllOfMatcher<OMPClause, OMPDefaultClause>
/// #pragma omp parallel
/// #pragma omp parallel default(none)
/// #pragma omp parallel default(shared)
+/// #pragma omp parallel default(firstprivate)
/// \endcode
///
/// ``ompDefaultClause(isNoneKind())`` matches only ``default(none)``.
@@ -7220,6 +7223,7 @@ AST_MATCHER(OMPDefaultClause, isNoneKind) {
/// #pragma omp parallel
/// #pragma omp parallel default(none)
/// #pragma omp parallel default(shared)
+/// #pragma omp parallel default(firstprivate)
/// \endcode
///
/// ``ompDefaultClause(isSharedKind())`` matches only ``default(shared)``.
@@ -7227,6 +7231,24 @@ AST_MATCHER(OMPDefaultClause, isSharedKind) {
return Node.getDefaultKind() == llvm::omp::OMP_DEFAULT_shared;
}
+/// Matches if the OpenMP ``default`` clause has ``firstprivate`` kind
+/// specified.
+///
+/// Given
+///
+/// \code
+/// #pragma omp parallel
+/// #pragma omp parallel default(none)
+/// #pragma omp parallel default(shared)
+/// #pragma omp parallel default(firstprivate)
+/// \endcode
+///
+/// ``ompDefaultClause(isFirstPrivateKind())`` matches only
+/// ``default(firstprivate)``.
+AST_MATCHER(OMPDefaultClause, isFirstPrivateKind) {
+ return Node.getDefaultKind() == llvm::omp::OMP_DEFAULT_firstprivate;
+}
+
/// Matches if the OpenMP directive is allowed to contain the specified OpenMP
/// clause kind.
///
diff --git a/clang/include/clang/Basic/DiagnosticParseKinds.td b/clang/include/clang/Basic/DiagnosticParseKinds.td
index f5b32a6ba5fa..1038a4119d4c 100644
--- a/clang/include/clang/Basic/DiagnosticParseKinds.td
+++ b/clang/include/clang/Basic/DiagnosticParseKinds.td
@@ -1334,6 +1334,8 @@ def warn_omp_more_one_device_type_clause
InGroup<OpenMPClauses>;
def err_omp_variant_ctx_second_match_extension : Error<
"only a single match extension allowed per OpenMP context selector">;
+def err_omp_invalid_dsa: Error<
+ "data-sharing attribute '%0' in '%1' clause requires OpenMP version %2 or above">;
// Pragma loop support.
def err_pragma_loop_missing_argument : Error<
diff --git a/clang/lib/ASTMatchers/Dynamic/Registry.cpp b/clang/lib/ASTMatchers/Dynamic/Registry.cpp
index a0a65092a92b..ec2215804c09 100644
--- a/clang/lib/ASTMatchers/Dynamic/Registry.cpp
+++ b/clang/lib/ASTMatchers/Dynamic/Registry.cpp
@@ -389,6 +389,7 @@ RegistryMaps::RegistryMaps() {
REGISTER_MATCHER(isExpr);
REGISTER_MATCHER(isExternC);
REGISTER_MATCHER(isFinal);
+ REGISTER_MATCHER(isFirstPrivateKind);
REGISTER_MATCHER(isImplicit);
REGISTER_MATCHER(isInStdNamespace);
REGISTER_MATCHER(isInTemplateInstantiation);
diff --git a/clang/lib/Parse/ParseOpenMP.cpp b/clang/lib/Parse/ParseOpenMP.cpp
index afcef3043843..5223755c8fdf 100644
--- a/clang/lib/Parse/ParseOpenMP.cpp
+++ b/clang/lib/Parse/ParseOpenMP.cpp
@@ -1441,7 +1441,7 @@ bool Parser::parseOMPDeclareVariantMatchClause(SourceLocation Loc,
/// Parsing of simple OpenMP clauses like 'default' or 'proc_bind'.
///
/// default-clause:
-/// 'default' '(' 'none' | 'shared' ')
+/// 'default' '(' 'none' | 'shared' | 'firstprivate' ')
///
/// proc_bind-clause:
/// 'proc_bind' '(' 'master' | 'close' | 'spread' ')
@@ -2772,7 +2772,7 @@ OMPClause *Parser::ParseOpenMPSingleExprClause(OpenMPClauseKind Kind,
/// Parsing of simple OpenMP clauses like 'default' or 'proc_bind'.
///
/// default-clause:
-/// 'default' '(' 'none' | 'shared' ')'
+/// 'default' '(' 'none' | 'shared' | 'firstprivate' ')'
///
/// proc_bind-clause:
/// 'proc_bind' '(' 'master' | 'close' | 'spread' ')'
@@ -2785,6 +2785,14 @@ OMPClause *Parser::ParseOpenMPSimpleClause(OpenMPClauseKind Kind,
llvm::Optional<SimpleClauseData> Val = parseOpenMPSimpleClause(*this, Kind);
if (!Val || ParseOnly)
return nullptr;
+ if (getLangOpts().OpenMP < 51 && Kind == OMPC_default &&
+ static_cast<DefaultKind>(Val.getValue().Type) ==
+ OMP_DEFAULT_firstprivate) {
+ Diag(Val.getValue().LOpen, diag::err_omp_invalid_dsa)
+ << getOpenMPClauseName(OMPC_firstprivate)
+ << getOpenMPClauseName(OMPC_default) << "5.1";
+ return nullptr;
+ }
return Actions.ActOnOpenMPSimpleClause(
Kind, Val.getValue().Type, Val.getValue().TypeLoc, Val.getValue().LOpen,
Val.getValue().Loc, Val.getValue().RLoc);
diff --git a/clang/lib/Sema/SemaOpenMP.cpp b/clang/lib/Sema/SemaOpenMP.cpp
index b27abb54c170..920463da4027 100644
--- a/clang/lib/Sema/SemaOpenMP.cpp
+++ b/clang/lib/Sema/SemaOpenMP.cpp
@@ -53,9 +53,10 @@ static const Expr *checkMapClauseExpressionBase(
namespace {
/// Default data sharing attributes, which can be applied to directive.
enum DefaultDataSharingAttributes {
- DSA_unspecified = 0, /// Data sharing attribute not specified.
- DSA_none = 1 << 0, /// Default data sharing attribute 'none'.
- DSA_shared = 1 << 1, /// Default data sharing attribute 'shared'.
+ DSA_unspecified = 0, /// Data sharing attribute not specified.
+ DSA_none = 1 << 0, /// Default data sharing attribute 'none'.
+ DSA_shared = 1 << 1, /// Default data sharing attribute 'shared'.
+ DSA_firstprivate = 1 << 2, /// Default data sharing attribute 'firstprivate'.
};
/// Stack for tracking declarations used in OpenMP directives and
@@ -684,6 +685,11 @@ class DSAStackTy {
getTopOfStack().DefaultAttr = DSA_shared;
getTopOfStack().DefaultAttrLoc = Loc;
}
+ /// Set default data sharing attribute to firstprivate.
+ void setDefaultDSAFirstPrivate(SourceLocation Loc) {
+ getTopOfStack().DefaultAttr = DSA_firstprivate;
+ getTopOfStack().DefaultAttrLoc = Loc;
+ }
/// Set default data mapping attribute to Modifier:Kind
void setDefaultDMAAttr(OpenMPDefaultmapClauseModifier M,
OpenMPDefaultmapClauseKind Kind,
@@ -1183,6 +1189,15 @@ DSAStackTy::DSAVarData DSAStackTy::getDSA(const_iterator &Iter,
return DVar;
case DSA_none:
return DVar;
+ case DSA_firstprivate:
+ if (VD->getStorageDuration() == SD_Static &&
+ VD->getDeclContext()->isFileContext()) {
+ DVar.CKind = OMPC_unknown;
+ } else {
+ DVar.CKind = OMPC_firstprivate;
+ }
+ DVar.ImplicitDSALoc = Iter->DefaultAttrLoc;
+ return DVar;
case DSA_unspecified:
// OpenMP [2.9.1.1, Data-sharing Attribute Rules for Variables Referenced
// in a Construct, implicitly determined, p.2]
@@ -2058,7 +2073,13 @@ bool Sema::isOpenMPCapturedByRef(const ValueDecl *D, unsigned Level,
// If the variable is artificial and must be captured by value - try to
// capture by value.
!(isa<OMPCapturedExprDecl>(D) && !D->hasAttr<OMPCaptureNoInitAttr>() &&
- !cast<OMPCapturedExprDecl>(D)->getInit()->isGLValue());
+ !cast<OMPCapturedExprDecl>(D)->getInit()->isGLValue()) &&
+ // If the variable is implicitly firstprivate and scalar - capture by
+ // copy
+ !(DSAStack->getDefaultDSA() == DSA_firstprivate &&
+ !DSAStack->hasExplicitDSA(
+ D, [](OpenMPClauseKind K) { return K != OMPC_unknown; }, Level) &&
+ !DSAStack->isLoopControlVariable(D, Level).first);
}
// When passing data by copy, we need to make sure it fits the uintptr size
@@ -2185,10 +2206,13 @@ VarDecl *Sema::isOpenMPCapturedDecl(ValueDecl *D, bool CheckScopeInfo,
DSAStack->isClauseParsingMode());
// Global shared must not be captured.
if (VD && !VD->hasLocalStorage() && DVarPrivate.CKind == OMPC_unknown &&
- (DSAStack->getDefaultDSA() != DSA_none || DVarTop.CKind == OMPC_shared))
+ ((DSAStack->getDefaultDSA() != DSA_none &&
+ DSAStack->getDefaultDSA() != DSA_firstprivate) ||
+ DVarTop.CKind == OMPC_shared))
return nullptr;
if (DVarPrivate.CKind != OMPC_unknown ||
- (VD && DSAStack->getDefaultDSA() == DSA_none))
+ (VD && (DSAStack->getDefaultDSA() == DSA_none ||
+ DSAStack->getDefaultDSA() == DSA_firstprivate)))
return VD ? VD : cast<VarDecl>(DVarPrivate.PrivateCopy->getDecl());
}
return nullptr;
@@ -3333,10 +3357,19 @@ class DSAAttrChecker final : public StmtVisitor<DSAAttrChecker, void> {
// in the construct, and does not have a predetermined data-sharing
// attribute, must have its data-sharing attribute explicitly determined
// by being listed in a data-sharing attribute clause.
- if (DVar.CKind == OMPC_unknown && Stack->getDefaultDSA() == DSA_none &&
+ if (DVar.CKind == OMPC_unknown &&
+ (Stack->getDefaultDSA() == DSA_none ||
+ Stack->getDefaultDSA() == DSA_firstprivate) &&
isImplicitOrExplicitTaskingRegion(DKind) &&
VarsWithInheritedDSA.count(VD) == 0) {
- VarsWithInheritedDSA[VD] = E;
+ bool InheritedDSA = Stack->getDefaultDSA() == DSA_none;
+ if (!InheritedDSA && Stack->getDefaultDSA() == DSA_firstprivate) {
+ DSAStackTy::DSAVarData DVar =
+ Stack->getImplicitDSA(VD, /*FromParent=*/false);
+ InheritedDSA = DVar.CKind == OMPC_unknown;
+ }
+ if (InheritedDSA)
+ VarsWithInheritedDSA[VD] = E;
return;
}
@@ -3438,7 +3471,9 @@ class DSAAttrChecker final : public StmtVisitor<DSAAttrChecker, void> {
// Define implicit data-sharing attributes for task.
DVar = Stack->getImplicitDSA(VD, /*FromParent=*/false);
- if (isOpenMPTaskingDirective(DKind) && DVar.CKind != OMPC_shared &&
+ if (((isOpenMPTaskingDirective(DKind) && DVar.CKind != OMPC_shared) ||
+ (Stack->getDefaultDSA() == DSA_firstprivate &&
+ DVar.CKind == OMPC_firstprivate && !DVar.RefExpr)) &&
!Stack->isLoopControlVariable(VD).first) {
ImplicitFirstprivate.push_back(E);
return;
@@ -5342,8 +5377,10 @@ StmtResult Sema::ActOnOpenMPExecutableDirective(
ErrorFound = Res.isInvalid() || ErrorFound;
- // Check variables in the clauses if default(none) was specified.
- if (DSAStack->getDefaultDSA() == DSA_none) {
+ // Check variables in the clauses if default(none) or
+ // default(firstprivate) was specified.
+ if (DSAStack->getDefaultDSA() == DSA_none ||
+ DSAStack->getDefaultDSA() == DSA_firstprivate) {
DSAAttrChecker DSAChecker(DSAStack, *this, nullptr);
for (OMPClause *C : Clauses) {
switch (C->getClauseKind()) {
@@ -5454,7 +5491,8 @@ StmtResult Sema::ActOnOpenMPExecutableDirective(
if (P.getFirst()->isImplicit() || isa<OMPCapturedExprDecl>(P.getFirst()))
continue;
ErrorFound = true;
- if (DSAStack->getDefaultDSA() == DSA_none) {
+ if (DSAStack->getDefaultDSA() == DSA_none ||
+ DSAStack->getDefaultDSA() == DSA_firstprivate) {
Diag(P.second->getExprLoc(), diag::err_omp_no_dsa_for_variable)
<< P.first << P.second->getSourceRange();
Diag(DSAStack->getDefaultDSALocation(), diag::note_omp_default_dsa_none);
@@ -12932,10 +12970,20 @@ OMPClause *Sema::ActOnOpenMPDefaultClause(DefaultKind Kind,
<< getOpenMPClauseName(OMPC_default);
return nullptr;
}
- if (Kind == OMP_DEFAULT_none)
+
+ switch (Kind) {
+ case OMP_DEFAULT_none:
DSAStack->setDefaultDSANone(KindKwLoc);
- else if (Kind == OMP_DEFAULT_shared)
+ break;
+ case OMP_DEFAULT_shared:
DSAStack->setDefaultDSAShared(KindKwLoc);
+ break;
+ case OMP_DEFAULT_firstprivate:
+ DSAStack->setDefaultDSAFirstPrivate(KindKwLoc);
+ break;
+ default:
+ llvm_unreachable("DSA unexpected in OpenMP default clause");
+ }
return new (Context)
OMPDefaultClause(Kind, KindKwLoc, StartLoc, LParenLoc, EndLoc);
diff --git a/clang/test/OpenMP/distribute_parallel_for_default_messages.cpp b/clang/test/OpenMP/distribute_parallel_for_default_messages.cpp
index 0629ba096d0c..67e4615ae8c0 100644
--- a/clang/test/OpenMP/distribute_parallel_for_default_messages.cpp
+++ b/clang/test/OpenMP/distribute_parallel_for_default_messages.cpp
@@ -2,8 +2,17 @@
// RUN: %clang_cc1 -verify -fopenmp-simd -ferror-limit 100 -o - %s -Wuninitialized
+// RUN: %clang_cc1 -verify -fopenmp-version=51 -DOMP51 -fopenmp -ferror-limit 100 -o - %s -Wuninitialized
+
+// RUN: %clang_cc1 -verify -fopenmp-version=51 -DOMP51 -fopenmp-simd -ferror-limit 100 -o - %s -Wuninitialized
+
void foo();
+namespace {
+static int y = 0;
+}
+static int x = 0;
+
template <class T, int N>
T tmain(T argc) {
int i;
@@ -14,12 +23,12 @@ T tmain(T argc) {
foo();
#pragma omp target
#pragma omp teams
-#pragma omp distribute parallel for default( // expected-error {{expected 'none' or 'shared' in OpenMP clause 'default'}} expected-error {{expected ')'}} expected-note {{to match this '('}}
+#pragma omp distribute parallel for default( // expected-error {{expected 'none', 'shared' or 'firstprivate' in OpenMP clause 'default'}} expected-error {{expected ')'}} expected-note {{to match this '('}}
for (i = 0; i < argc; ++i)
foo();
#pragma omp target
#pragma omp teams
-#pragma omp distribute parallel for default() // expected-error {{expected 'none' or 'shared' in OpenMP clause 'default'}}
+#pragma omp distribute parallel for default() // expected-error {{expected 'none', 'shared' or 'firstprivate' in OpenMP clause 'default'}}
for (i = 0; i < argc; ++i)
foo();
#pragma omp target
@@ -34,7 +43,7 @@ T tmain(T argc) {
foo();
#pragma omp target
#pragma omp teams
-#pragma omp distribute parallel for default(x) // expected-error {{expected 'none' or 'shared' in OpenMP clause 'default'}}
+#pragma omp distribute parallel for default(x) // expected-error {{expected 'none', 'shared' or 'firstprivate' in OpenMP clause 'default'}}
for (i = 0; i < argc; ++i)
foo();
#pragma omp target
@@ -62,12 +71,12 @@ int main(int argc, char **argv) {
foo();
#pragma omp target
#pragma omp teams
-#pragma omp distribute parallel for default( // expected-error {{expected 'none' or 'shared' in OpenMP clause 'default'}} expected-error {{expected ')'}} expected-note {{to match this '('}}
+#pragma omp distribute parallel for default( // expected-error {{expected 'none', 'shared' or 'firstprivate' in OpenMP clause 'default'}} expected-error {{expected ')'}} expected-note {{to match this '('}}
for (i = 0; i < argc; ++i)
foo();
#pragma omp target
#pragma omp teams
-#pragma omp distribute parallel for default() // expected-error {{expected 'none' or 'shared' in OpenMP clause 'default'}}
+#pragma omp distribute parallel for default() // expected-error {{expected 'none', 'shared' or 'firstprivate' in OpenMP clause 'default'}}
for (i = 0; i < argc; ++i)
foo();
#pragma omp target
@@ -82,7 +91,7 @@ int main(int argc, char **argv) {
foo();
#pragma omp target
#pragma omp teams
-#pragma omp distribute parallel for default(x) // expected-error {{expected 'none' or 'shared' in OpenMP clause 'default'}}
+#pragma omp distribute parallel for default(x) // expected-error {{expected 'none', 'shared' or 'firstprivate' in OpenMP clause 'default'}}
for (i = 0; i < argc; ++i)
foo();
#pragma omp target
@@ -98,5 +107,15 @@ int main(int argc, char **argv) {
for (i = 0; i < argc; ++i) // expected-error {{variable 'argc' must have explicitly specified data sharing attributes}}
foo();
+#ifdef OMP51
+#pragma omp target
+#pragma omp teams
+#pragma omp distribute parallel for default(firstprivate) // expected-note 2 {{explicit data sharing attribute requested here}}
+ for (i = 0; i < argc; ++i) {
+ ++x; // expected-error {{variable 'x' must have explicitly specified data sharing attributes}}
+ ++y; // expected-error {{variable 'y' must have explicitly specified data sharing attributes}}
+ }
+#endif
+
return (tmain<int, 5>(argc) + tmain<char, 1>(argv[0][0])); // expected-note {{in instantiation of function template specialization 'tmain<int, 5>' requested here}} expected-note {{in instantiation of function template specialization 'tmain<char, 1>' requested here}}
}
diff --git a/clang/test/OpenMP/distribute_parallel_for_simd_default_messages.cpp b/clang/test/OpenMP/distribute_parallel_for_simd_default_messages.cpp
index b9c5546ec5d9..9aab00f16c48 100644
--- a/clang/test/OpenMP/distribute_parallel_for_simd_default_messages.cpp
+++ b/clang/test/OpenMP/distribute_parallel_for_simd_default_messages.cpp
@@ -2,8 +2,17 @@
// RUN: %clang_cc1 -verify -fopenmp-simd -ferror-limit 100 -o - %s -Wuninitialized
+// RUN: %clang_cc1 -verify -fopenmp -ferror-limit 100 -o - %s -Wuninitialized -DOMP51 -fopenmp-version=51
+
+// RUN: %clang_cc1 -verify -fopenmp-simd -ferror-limit 100 -o - %s -Wuninitialized -DOMP51 -fopenmp-version=51
+
void foo();
+namespace {
+static int y = 0;
+}
+static int x = 0;
+
template <class T, int N>
T tmain(T argc) {
int i;
@@ -14,12 +23,12 @@ T tmain(T argc) {
foo();
#pragma omp target
#pragma omp teams
-#pragma omp distribute parallel for simd default( // expected-error {{expected 'none' or 'shared' in OpenMP clause 'default'}} expected-error {{expected ')'}} expected-note {{to match this '('}}
+#pragma omp distribute parallel for simd default( // expected-error {{expected 'none', 'shared' or 'firstprivate' in OpenMP clause 'default'}} expected-error {{expected ')'}} expected-note {{to match this '('}}
for (i = 0; i < argc; ++i)
foo();
#pragma omp target
#pragma omp teams
-#pragma omp distribute parallel for simd default() // expected-error {{expected 'none' or 'shared' in OpenMP clause 'default'}}
+#pragma omp distribute parallel for simd default() // expected-error {{expected 'none', 'shared' or 'firstprivate' in OpenMP clause 'default'}}
for (i = 0; i < argc; ++i)
foo();
#pragma omp target
@@ -34,7 +43,7 @@ T tmain(T argc) {
foo();
#pragma omp target
#pragma omp teams
-#pragma omp distribute parallel for simd default(x) // expected-error {{expected 'none' or 'shared' in OpenMP clause 'default'}}
+#pragma omp distribute parallel for simd default(x) // expected-error {{expected 'none', 'shared' or 'firstprivate' in OpenMP clause 'default'}}
for (i = 0; i < argc; ++i)
foo();
#pragma omp target
@@ -62,12 +71,12 @@ int main(int argc, char **argv) {
foo();
#pragma omp target
#pragma omp teams
-#pragma omp distribute parallel for simd default( // expected-error {{expected 'none' or 'shared' in OpenMP clause 'default'}} expected-error {{expected ')'}} expected-note {{to match this '('}}
+#pragma omp distribute parallel for simd default( // expected-error {{expected 'none', 'shared' or 'firstprivate' in OpenMP clause 'default'}} expected-error {{expected ')'}} expected-note {{to match this '('}}
for (i = 0; i < argc; ++i)
foo();
#pragma omp target
#pragma omp teams
-#pragma omp distribute parallel for simd default() // expected-error {{expected 'none' or 'shared' in OpenMP clause 'default'}}
+#pragma omp distribute parallel for simd default() // expected-error {{expected 'none', 'shared' or 'firstprivate' in OpenMP clause 'default'}}
for (i = 0; i < argc; ++i)
foo();
#pragma omp target
@@ -82,7 +91,7 @@ int main(int argc, char **argv) {
foo();
#pragma omp target
#pragma omp teams
-#pragma omp distribute parallel for simd default(x) // expected-error {{expected 'none' or 'shared' in OpenMP clause 'default'}}
+#pragma omp distribute parallel for simd default(x) // expected-error {{expected 'none', 'shared' or 'firstprivate' in OpenMP clause 'default'}}
for (i = 0; i < argc; ++i)
foo();
#pragma omp target
@@ -90,6 +99,15 @@ int main(int argc, char **argv) {
#pragma omp distribute parallel for simd default(none) // expected-note {{explicit data sharing attribute requested here}}
for (i = 0; i < argc; ++i) // expected-error {{variable 'argc' must have explicitly specified data sharing attributes}}
foo();
+#ifdef OpenMP51
+#pragma omp target
+#pragma omp teams
+#pragma omp distribute parallel for simd default(firstprivate) // expected-note 2 {{explicit data sharing attribute requested here}}
+ for (i = 0; i < argc; ++i) {
+ ++x; // expected-error {{variable 'x' must have explicitly specified data sharing attributes}}
+ ++y; // expected-error {{variable 'y' must have explicitly specified data sharing attributes}}
+ }
+#endif
#pragma omp parallel default(none) // expected-note 2 {{explicit data sharing attribute requested here}}
#pragma omp target
diff --git a/clang/test/OpenMP/driver.c b/clang/test/OpenMP/driver.c
index fa5bd1a8b5f8..047478256f9f 100644
--- a/clang/test/OpenMP/driver.c
+++ b/clang/test/OpenMP/driver.c
@@ -47,6 +47,7 @@
// RUN: %clang %s -c -E -dM -fopenmp-simd -fopenmp-version=31 | FileCheck --check-prefix=CHECK-VERSION %s
// RUN: %clang %s -c -E -dM -fopenmp-simd -fopenmp-version=40 | FileCheck --check-prefix=CHECK-VERSION %s
// RUN: %clang %s -c -E -dM -fopenmp-simd -fopenmp-version=45 | FileCheck --check-prefix=CHECK-VERSION %s
+// RUN: %clang %s -c -E -dM -fopenmp-simd -fopenmp-version=51 | FileCheck --check-prefix=CHECK-VERSION %s
// CHECK-VERSION-NOT: #define _OPENMP
diff --git a/clang/test/OpenMP/parallel_default_messages.cpp b/clang/test/OpenMP/parallel_default_messages.cpp
index 6b8ad6705185..b098c43852a8 100644
--- a/clang/test/OpenMP/parallel_default_messages.cpp
+++ b/clang/test/OpenMP/parallel_default_messages.cpp
@@ -4,18 +4,25 @@
// RUN: %clang_cc1 -verify=expected,ge40 -fopenmp-version=40 -fopenmp -ferror-limit 100 -o - %s -Wuninitialized
// RUN: %clang_cc1 -verify -fopenmp-version=31 -fopenmp -ferror-limit 100 -o - %s -Wuninitialized
// RUN: %clang_cc1 -verify -fopenmp-version=30 -fopenmp -ferror-limit 100 -o - %s -Wuninitialized
+// RUN: %clang_cc1 -verify=expected,ge40 -fopenmp-version=51 -fopenmp -DOMP51 -ferror-limit 100 -o - %s -Wuninitialized
+// RUN: %clang_cc1 -verify=expected,ge40 -fopenmp-version=51 -fopenmp-simd -DOMP51 -ferror-limit 100 -o - %s -Wuninitialized
void foo();
+namespace {
+static int y = 0;
+}
+static int x = 0;
+
int main(int argc, char **argv) {
const int c = 0;
#pragma omp parallel default // expected-error {{expected '(' after 'default'}}
- #pragma omp parallel default ( // expected-error {{expected 'none' or 'shared' in OpenMP clause 'default'}} expected-error {{expected ')'}} expected-note {{to match this '('}}
- #pragma omp parallel default () // expected-error {{expected 'none' or 'shared' in OpenMP clause 'default'}}
- #pragma omp parallel default (none // expected-error {{expected ')'}} expected-note {{to match this '('}}
- #pragma omp parallel default (shared), default(shared) // expected-error {{directive '#pragma omp parallel' cannot contain more than one 'default' clause}}
- #pragma omp parallel default (x) // expected-error {{expected 'none' or 'shared' in OpenMP clause 'default'}}
+#pragma omp parallel default( // expected-error {{expected 'none', 'shared' or 'firstprivate' in OpenMP clause 'default'}} expected-error {{expected ')'}} expected-note {{to match this '('}}
+#pragma omp parallel default() // expected-error {{expected 'none', 'shared' or 'firstprivate' in OpenMP clause 'default'}}
+#pragma omp parallel default(none // expected-error {{expected ')'}} expected-note {{to match this '('}}
+#pragma omp parallel default(shared), default(shared) // expected-error {{directive '#pragma omp parallel' cannot contain more than one 'default' clause}}
+#pragma omp parallel default(x) // expected-error {{expected 'none', 'shared' or 'firstprivate' in OpenMP clause 'default'}}
foo();
#pragma omp parallel default(none) // expected-note {{explicit data sharing attribute requested here}}
@@ -27,5 +34,14 @@ int main(int argc, char **argv) {
#pragma omp parallel default(none) // ge40-note {{explicit data sharing attribute requested here}}
(void)c; // ge40-error {{variable 'c' must have explicitly specified data sharing attributes}}
+
+#ifdef OMP51
+#pragma omp parallel default(firstprivate) // expected-note 2 {{explicit data sharing attribute requested here}}
+ {
+ ++x; // expected-error {{variable 'x' must have explicitly specified data sharing attributes}}
+ ++y; // expected-error {{variable 'y' must have explicitly specified data sharing attributes}}
+ }
+#endif
+
return 0;
}
diff --git a/clang/test/OpenMP/parallel_for_default_messages.cpp b/clang/test/OpenMP/parallel_for_default_messages.cpp
index b02fa8803a3b..c64b76948c01 100644
--- a/clang/test/OpenMP/parallel_for_default_messages.cpp
+++ b/clang/test/OpenMP/parallel_for_default_messages.cpp
@@ -2,17 +2,26 @@
// RUN: %clang_cc1 -verify -fopenmp-simd -ferror-limit 100 -o - %s -Wuninitialized
+// RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=51 -DOMP51 -ferror-limit 100 -o - %s -Wuninitialized
+
+// RUN: %clang_cc1 -verify -fopenmp-simd -fopenmp-version=51 -DOMP51 -ferror-limit 100 -o - %s -Wuninitialized
+
void foo();
+namespace {
+static int y = 0;
+}
+static int x = 0;
+
int main(int argc, char **argv) {
int i;
#pragma omp parallel for default // expected-error {{expected '(' after 'default'}}
for (i = 0; i < argc; ++i)
foo();
-#pragma omp parallel for default( // expected-error {{expected 'none' or 'shared' in OpenMP clause 'default'}} expected-error {{expected ')'}} expected-note {{to match this '('}}
+#pragma omp parallel for default( // expected-error {{expected 'none', 'shared' or 'firstprivate' in OpenMP clause 'default'}} expected-error {{expected ')'}} expected-note {{to match this '('}}
for (i = 0; i < argc; ++i)
foo();
-#pragma omp parallel for default() // expected-error {{expected 'none' or 'shared' in OpenMP clause 'default'}}
+#pragma omp parallel for default() // expected-error {{expected 'none', 'shared' or 'firstprivate' in OpenMP clause 'default'}}
for (i = 0; i < argc; ++i)
foo();
#pragma omp parallel for default(none // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-note {{explicit data sharing attribute requested here}}
@@ -21,7 +30,7 @@ int main(int argc, char **argv) {
#pragma omp parallel for default(shared), default(shared) // expected-error {{directive '#pragma omp parallel for' cannot contain more than one 'default' clause}}
for (i = 0; i < argc; ++i)
foo();
-#pragma omp parallel for default(x) // expected-error {{expected 'none' or 'shared' in OpenMP clause 'default'}}
+#pragma omp parallel for default(x) // expected-error {{expected 'none', 'shared' or 'firstprivate' in OpenMP clause 'default'}}
for (i = 0; i < argc; ++i)
foo();
@@ -34,5 +43,13 @@ int main(int argc, char **argv) {
for (i = 0; i < argc; ++i) // expected-error {{variable 'argc' must have explicitly specified data sharing attributes}}
foo();
+#ifdef OMP51
+#pragma omp parallel for default(firstprivate) // expected-note 2 {{explicit data sharing attribute requested here}}
+ for (i = 0; i < argc; ++i) {
+ ++y; // expected-error {{variable 'y' must have explicitly specified data sharing attributes}}
+ ++x; // expected-error {{variable 'x' must have explicitly specified data sharing attributes}}
+ }
+#endif
+
return 0;
}
diff --git a/clang/test/OpenMP/parallel_for_simd_default_messages.cpp b/clang/test/OpenMP/parallel_for_simd_default_messages.cpp
index 570ee14bbc84..6368d280de5d 100644
--- a/clang/test/OpenMP/parallel_for_simd_default_messages.cpp
+++ b/clang/test/OpenMP/parallel_for_simd_default_messages.cpp
@@ -2,17 +2,26 @@
// RUN: %clang_cc1 -verify -fopenmp-simd -o - %s -Wuninitialized
+// RUN: %clang_cc1 -verify -fopenmp-version=51 -DOMP51 -fopenmp -o - %s -Wuninitialized
+
+// RUN: %clang_cc1 -verify -fopenmp-version=51 -DOMP51 -fopenmp-simd -o - %s -Wuninitialized
+
void foo();
+namespace {
+static int y = 0;
+}
+static int x = 0;
+
int main(int argc, char **argv) {
int i;
#pragma omp parallel for simd default // expected-error {{expected '(' after 'default'}}
for (i = 0; i < argc; ++i)
foo();
-#pragma omp parallel for simd default( // expected-error {{expected 'none' or 'shared' in OpenMP clause 'default'}} expected-error {{expected ')'}} expected-note {{to match this '('}}
+#pragma omp parallel for simd default( // expected-error {{expected 'none', 'shared' or 'firstprivate' in OpenMP clause 'default'}} expected-error {{expected ')'}} expected-note {{to match this '('}}
for (i = 0; i < argc; ++i)
foo();
-#pragma omp parallel for simd default() // expected-error {{expected 'none' or 'shared' in OpenMP clause 'default'}}
+#pragma omp parallel for simd default() // expected-error {{expected 'none', 'shared' or 'firstprivate' in OpenMP clause 'default'}}
for (i = 0; i < argc; ++i)
foo();
#pragma omp parallel for simd default(none // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-note {{explicit data sharing attribute requested here}}
@@ -21,7 +30,7 @@ int main(int argc, char **argv) {
#pragma omp parallel for simd default(shared), default(shared) // expected-error {{directive '#pragma omp parallel for simd' cannot contain more than one 'default' clause}}
for (i = 0; i < argc; ++i)
foo();
-#pragma omp parallel for simd default(x) // expected-error {{expected 'none' or 'shared' in OpenMP clause 'default'}}
+#pragma omp parallel for simd default(x) // expected-error {{expected 'none', 'shared' or 'firstprivate' in OpenMP clause 'default'}}
for (i = 0; i < argc; ++i)
foo();
@@ -34,5 +43,13 @@ int main(int argc, char **argv) {
for (i = 0; i < argc; ++i) // expected-error {{variable 'argc' must have explicitly specified data sharing attributes}} expected-error {{variable 'i' must have explicitly specified data sharing attributes}}
foo();
+#ifdef OMP51
+#pragma omp parallel for default(firstprivate) // expected-note 2 {{explicit data sharing attribute requested here}}
+ for (i = 0; i < argc; ++i) {
+ x++; // expected-error {{variable 'x' must have explicitly specified data sharing attributes}}
+ y++; // expected-error {{variable 'y' must have explicitly specified data sharing attributes}}
+ }
+#endif
+
return 0;
}
diff --git a/clang/test/OpenMP/parallel_master_codegen.cpp b/clang/test/OpenMP/parallel_master_codegen.cpp
index 9ffa941314b9..82e18c80f103 100644
--- a/clang/test/OpenMP/parallel_master_codegen.cpp
+++ b/clang/test/OpenMP/parallel_master_codegen.cpp
@@ -118,6 +118,162 @@ void parallel_master_private() {
#endif
+#ifdef CK31
+///==========================================================================///
+// RUN: %clang_cc1 -DCK31 -fopenmp-version=51 -verify -fopenmp -x c++ -triple x86_64-unknown-unknown -emit-llvm %s -fexceptions -fcxx-exceptions -o - | FileCheck %s --check-prefix CK31
+// RUN: %clang_cc1 -DCK31 -fopenmp-version=51 -fopenmp -x c++ -std=c++11 -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -emit-pch -o %t %s
+// RUN: %clang_cc1 -DCK31 -fopenmp-version=51 -fopenmp -x c++ -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --check-prefix CK31
+
+// RUN: %clang_cc1 -DCK31 -fopenmp-version=51 -verify -fopenmp-simd -x c++ -triple x86_64-unknown-unknown -emit-llvm %s -fexceptions -fcxx-exceptions -o - | FileCheck --check-prefix SIMD-ONLY0 %s
+// RUN: %clang_cc1 -DCK31 -fopenmp-version=51 -fopenmp-simd -x c++ -std=c++11 -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -emit-pch -o %t %s
+// RUN: %clang_cc1 -DCK31 -fopenmp-version=51 -fopenmp-simd -x c++ -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck --check-prefix SIMD-ONLY0 %s
+// SIMD-ONLY0-NOT: {{__kmpc|__tgt}}
+
+// CK31-DAG: %struct.ident_t = type { i32, i32, i32, i32, i8* }
+// CK31-DAG: [[STR:@.+]] = private unnamed_addr constant [23 x i8] c";unknown;unknown;0;0;;\00"
+
+void parallel_master_default_firstprivate() {
+ int a;
+#pragma omp parallel master default(firstprivate)
+ a++;
+}
+
+// CK31-LABEL: define void @{{.+}}parallel_master{{.+}}
+// CK31: [[A_VAL:%.+]] = alloca i32{{.+}}
+// CK31: [[A_CASTED:%.+]] = alloca i64
+// CK31: [[ZERO_VAL:%.+]] = load i32, i32* [[A_VAL]]
+// CK31: [[CONV:%.+]] = bitcast i64* [[A_CASTED]] to i32*
+// CK31: store i32 [[ZERO_VAL]], i32* [[CONV]]
+// CK31: [[ONE_VAL:%.+]] = load i64, i64* [[A_CASTED]]
+// CK31: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @0, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i64)* @.omp_outlined. to void (i32*, i32*, ...)*), i64 [[ONE_VAL]])
+// CK31: ret void
+
+// CK31: [[GLOBAL_TID_ADDR:%.+]] = alloca i32*
+// CK31: [[BOUND_TID_ADDR:%.+]] = alloca i32*
+// CK31: [[A_ADDR:%.+]] = alloca i64{{.+}}
+// CK31: store i32* [[GLOBAL_TID:%.+]], i32** [[GLOBAL_TID_ADDR]]{{.+}}
+// CK31: store i32* [[BOUND_TID:%.+]], i32** [[BOUND_TID_ADDR]]
+// CK31: store i64 [[A_VAL]], i64* [[A_ADDR]]
+// CK31: [[CONV]] = bitcast i64* [[A_ADDR]]
+// CK31: [[ZERO_VAL]] = load i32*, i32** [[GLOBAL_TID_ADDR]]
+// CK31: [[ONE_VAL]] = load i32, i32* [[ZERO_VAL]]
+// CK31: [[TWO_VAL:%.+]] = call i32 @__kmpc_master(%struct.ident_t* @0, i32 [[ONE_VAL]])
+// CK31: [[THREE:%.+]] = icmp ne i32 [[TWO_VAL]], 0
+// CK31: br i1 %3, label [[OMP_IF_THEN:%.+]], label [[OMP_IF_END:%.+]]
+
+// CK31: [[FOUR:%.+]] = load i32, i32* [[CONV:%.+]]
+// CK31: [[INC:%.+]] = add nsw i32 [[FOUR]]
+// CK31: store i32 [[INC]], i32* [[CONV]]
+// CK31: call void @__kmpc_end_master(%struct.ident_t* @0, i32 [[ONE_VAL]])
+// CK31: br label [[OMP_IF_END]]
+
+// CK31: ret void
+
+#endif
+
+#ifdef CK32
+///==========================================================================///
+// RUN: %clang_cc1 -DCK32 -fopenmp-version=51 -verify -fopenmp -x c++ -triple x86_64-unknown-unknown -emit-llvm %s -fexceptions -fcxx-exceptions -o - | FileCheck %s --check-prefix CK32
+// RUN: %clang_cc1 -DCK32 -fopenmp-version=51 -fopenmp -x c++ -std=c++11 -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -emit-pch -o %t %s
+// RUN: %clang_cc1 -DCK32 -fopenmp-version=51 -fopenmp -x c++ -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --check-prefix CK32
+
+// RUN: %clang_cc1 -DCK32 -fopenmp-version=51 -verify -fopenmp-simd -x c++ -triple x86_64-unknown-unknown -emit-llvm %s -fexceptions -fcxx-exceptions -o - | FileCheck --check-prefix SIMD-ONLY0 %s
+// RUN: %clang_cc1 -DCK32 -fopenmp-version=51 -fopenmp-simd -x c++ -std=c++11 -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -emit-pch -o %t %s
+// RUN: %clang_cc1 -DCK32 -fopenmp-version=51 -fopenmp-simd -x c++ -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck --check-prefix SIMD-ONLY0 %s
+// SIMD-ONLY0-NOT: {{__kmpc|__tgt}}
+
+// CK32-DAG: %struct.ident_t = type { i32, i32, i32, i32, i8* }
+// CK32-DAG: [[STR:@.+]] = private unnamed_addr constant [23 x i8] c";unknown;unknown;0;0;;\00"
+
+struct St {
+ int a, b;
+ static int y;
+ St() : a(0), b(0) {}
+ ~St() {}
+};
+int St::y = 0;
+
+void parallel_master_default_firstprivate() {
+ St a = St();
+ static int y = 0;
+#pragma omp parallel master default(firstprivate)
+ {
+ a.a += 1;
+ a.b += 1;
+ y++;
+ a.y++;
+ }
+}
+
+// CK32-LABEL: define {{.+}} @{{.+}}parallel_master_default_firstprivate{{.+}}
+// CK32: [[A_VAL:%.+]] = alloca %struct.St{{.+}}
+// CK32: [[Y_CASTED:%.+]] = alloca i64
+// CK32: call void @[[CTOR:.+]](%struct.St* [[A_VAL]])
+// CK32: [[ZERO:%.+]] = load i32, i32* @{{.+}}parallel_master_default_firstprivate{{.+}}
+// CK32: [[CONV:%.+]] = bitcast i64* [[Y_CASTED]] to i32*
+// CK32: store i32 [[ZERO]], i32* [[CONV]]
+// CK32: [[ONE:%.+]] = load i64, i64* [[Y_CASTED]]
+// CK32: call void {{.+}}@{{.+}} %struct.St* [[A_VAL]], i64 [[ONE]])
+// CK32: call void [[DTOR:@.+]](%struct.St* [[A_VAL]])
+
+// CK32: [[THIS_ADDR:%.+]] = alloca %struct.St*
+// CK32: store %struct.St* [[THIS:%.+]], %struct.St** [[THIS_ADDR]]
+// CK32: [[THIS_ONE:%.+]] = load %struct.St*, %struct.St** [[THIS_ADDR]]
+// CK32: call void [[CTOR_2:.+]](%struct.St* [[THIS_ONE]])
+// CK32: ret void
+
+// CK32: [[GLOBAL_TID_ADDR:%.+]] = alloca i32*
+// CK32: [[BOUND_TID_ADDR:%.+]] = alloca i32*
+// CK32: [[A_ADDR:%.+]] = alloca %struct.St
+// CK32: [[Y_ADDR:%.+]] = alloca i64
+// CK32: store i32* [[GLOBAL_TID:%.+]], i32** [[GLOBAL_TID_ADDR]]
+// CK32: store i32* %.bound_tid., i32** [[BOUND_TID_ADDR]]
+// CK32: store %struct.St* [[A_VAL]], %struct.St** [[A_ADDR]]{{.+}}
+// CK32: store i64 [[Y:%.+]], i64* [[Y_ADDR]]
+// CK32: [[ONE:%.+]] = load i32*, i32** [[GLOBAL_TID_ADDR]]
+// CK32: [[TWO:%.+]] = load i32, i32* [[ONE]]
+// CK32: [[THREE:%.+]] = call i32 @{{.+}} i32 [[TWO]])
+// CK32: [[FOUR:%.+]] = icmp ne i32 [[THREE]], 0
+// CK32: br i1 [[FOUR]], label [[IF_THEN:%.+]], label [[IF_END:%.+]]
+
+// CK32: [[A_1:%.+]] = getelementptr inbounds %struct.St, %struct.St* [[ZERO]], i32 0, i32 0
+// CK32: [[FIVE:%.+]] = load i32, i32* [[A_1]]
+// CK32: [[ADD:%.+]] = add nsw i32 [[FIVE]], 1
+// CK32: store i32 [[ADD]], i32* [[A_1]]
+// CK32: [[B:%.+]] = getelementptr inbounds %struct.St, %struct.St* [[ZERO]], i32 0, i32 1
+// CK32: [[SIX:%.+]] = load i32, i32* [[B]]
+// CK32: [[ADD_2:%.+]] = add nsw i32 [[SIX]], 1
+// CK32: store i32 [[ADD_2]], i32* [[B]]
+// CK32: [[SEVEN:%.+]] = load i32, i32* [[CONV]]
+// CK32: [[INC:%.+]] = add nsw i32 [[SEVEN]], 1
+// CK32: store i32 [[INC]], i32* [[CONV]]
+// CK32: [[EIGHT:%.+]] = load i32, i32* [[FUNC:@.+]]
+// CK32: [[INC_3:%.+]] = add nsw i32 [[EIGHT]], 1
+// CK32: store i32 [[INC_3]], i32* @{{.+}}
+// CK32: call void @{{.+}} i32 [[TWO]])
+// CK32: br label [[IF_END]]
+
+// CK32: [[DTOR]](%struct.St* [[THIS]])
+// CK32: [[THIS_ADDR]] = alloca %struct.St*
+// CK32: store %struct.St* [[THIS]], %struct.St** [[THIS_ADDR]]
+// CK32: [[THIS_ONE]] = load %struct.St*, %struct.St** [[THIS_ADDR]]
+// CK32: call void @_ZN2StD2Ev(%struct.St* [[THIS_ONE]])
+
+// CK32: [[THIS_ADDR]] = alloca %struct.St*
+// CK32: store %struct.St* [[THIS]], %struct.St** [[THIS_ADDR]]
+// CK32: [[THIS_ONE]] = load %struct.St*, %struct.St** [[THIS_ADDR]]
+// CK32: [[A_VAL]] = getelementptr inbounds %struct.St, %struct.St* [[THIS_ONE]], i32 0, i32 0
+// CK32: store i32 0, i32* [[A_VAL]]
+// CK32: [[B_VAL:%.+]] = getelementptr inbounds %struct.St, %struct.St* [[THIS_ONE]], i32 0, i32 1
+// CK32: store i32 0, i32* [[B_VAL]]
+// CK32: ret void
+
+// CK32: [[THIS_ADDR:%.+]] = alloca %struct.St*
+// CK32: store %struct.St* %this, %struct.St** [[THIS_ADDR]]
+// CK32: [[THIS_ONE]] = load %struct.St*, %struct.St** [[THIS_ADDR]]
+
+#endif
+
#ifdef CK4
///==========================================================================///
// RUN: %clang_cc1 -DCK4 -verify -fopenmp -x c++ -triple x86_64-unknown-unknown -emit-llvm %s -fexceptions -fcxx-exceptions -o - | FileCheck %s --check-prefix CK4
diff --git a/clang/test/OpenMP/parallel_master_default_messages.cpp b/clang/test/OpenMP/parallel_master_default_messages.cpp
index 557cba5aa322..39f78ea53ae1 100644
--- a/clang/test/OpenMP/parallel_master_default_messages.cpp
+++ b/clang/test/OpenMP/parallel_master_default_messages.cpp
@@ -2,20 +2,29 @@
// RUN: %clang_cc1 -verify -fopenmp-simd -ferror-limit 100 -o - %s -Wuninitialized
+// RUN: %clang_cc1 -verify -fopenmp-version=51 -DOMP51 -fopenmp -ferror-limit 100 -o - %s -Wuninitialized
+
+// RUN: %clang_cc1 -verify -fopenmp-version=51 -DOMP51 -fopenmp-simd -ferror-limit 100 -o - %s -Wuninitialized
+
void foo();
+namespace {
+static int y = 0;
+}
+static int x = 0;
+
int main(int argc, char **argv) {
#pragma omp parallel master default // expected-error {{expected '(' after 'default'}}
{
-#pragma omp parallel master default( // expected-error {{expected 'none' or 'shared' in OpenMP clause 'default'}} expected-error {{expected ')'}} expected-note {{to match this '('}}
+#pragma omp parallel master default( // expected-error {{expected 'none', 'shared' or 'firstprivate' in OpenMP clause 'default'}} expected-error {{expected ')'}} expected-note {{to match this '('}}
{
-#pragma omp parallel master default() // expected-error {{expected 'none' or 'shared' in OpenMP clause 'default'}}
+#pragma omp parallel master default() // expected-error {{expected 'none', 'shared' or 'firstprivate' in OpenMP clause 'default'}}
{
#pragma omp parallel master default(none // expected-error {{expected ')'}} expected-note {{to match this '('}}
{
#pragma omp parallel master default(shared), default(shared) // expected-error {{directive '#pragma omp parallel master' cannot contain more than one 'default' clause}}
{
-#pragma omp parallel master default(x) // expected-error {{expected 'none' or 'shared' in OpenMP clause 'default'}}
+#pragma omp parallel master default(x) // expected-error {{expected 'none', 'shared' or 'firstprivate' in OpenMP clause 'default'}}
{
foo();
}
@@ -37,5 +46,14 @@ int main(int argc, char **argv) {
++argc; // expected-error {{variable 'argc' must have explicitly specified data sharing attributes}}
}
}
+
+#ifdef OMP51
+#pragma omp parallel master default(firstprivate) // expected-note 2 {{explicit data sharing attribute requested here}}
+ {
+ ++x; // expected-error {{variable 'x' must have explicitly specified data sharing attributes}}
+ ++y; // expected-error {{variable 'y' must have explicitly specified data sharing attributes}}
+ }
+#endif
+
return 0;
}
diff --git a/clang/test/OpenMP/parallel_sections_default_messages.cpp b/clang/test/OpenMP/parallel_sections_default_messages.cpp
index d6a10fe56b34..cfa95445fb53 100644
--- a/clang/test/OpenMP/parallel_sections_default_messages.cpp
+++ b/clang/test/OpenMP/parallel_sections_default_messages.cpp
@@ -7,15 +7,15 @@ void foo();
int main(int argc, char **argv) {
#pragma omp parallel sections default // expected-error {{expected '(' after 'default'}}
{
-#pragma omp parallel sections default( // expected-error {{expected 'none' or 'shared' in OpenMP clause 'default'}} expected-error {{expected ')'}} expected-note {{to match this '('}}
+#pragma omp parallel sections default( // expected-error {{expected 'none', 'shared' or 'firstprivate' in OpenMP clause 'default'}} expected-error {{expected ')'}} expected-note {{to match this '('}}
{
-#pragma omp parallel sections default() // expected-error {{expected 'none' or 'shared' in OpenMP clause 'default'}}
+#pragma omp parallel sections default() // expected-error {{expected 'none', 'shared' or 'firstprivate' in OpenMP clause 'default'}}
{
#pragma omp parallel sections default(none // expected-error {{expected ')'}} expected-note {{to match this '('}}
{
#pragma omp parallel sections default(shared), default(shared) // expected-error {{directive '#pragma omp parallel sections' cannot contain more than one 'default' clause}}
{
-#pragma omp parallel sections default(x) // expected-error {{expected 'none' or 'shared' in OpenMP clause 'default'}}
+#pragma omp parallel sections default(x) // expected-error {{expected 'none', 'shared' or 'firstprivate' in OpenMP clause 'default'}}
{
foo();
}
diff --git a/clang/test/OpenMP/target_parallel_default_messages.cpp b/clang/test/OpenMP/target_parallel_default_messages.cpp
index 0691cdf37e4e..c8f68659438f 100644
--- a/clang/test/OpenMP/target_parallel_default_messages.cpp
+++ b/clang/test/OpenMP/target_parallel_default_messages.cpp
@@ -2,20 +2,29 @@
// RUN: %clang_cc1 -verify -fopenmp-simd -ferror-limit 100 -o - %s -Wuninitialized
+// RUN: %clang_cc1 -verify -fopenmp-version=51 -DOMP51 -fopenmp -ferror-limit 100 -o - %s -Wuninitialized
+
+// RUN: %clang_cc1 -verify -fopenmp-version=51 -DOMP51 -fopenmp-simd -ferror-limit 100 -o - %s -Wuninitialized
+
void foo();
+namespace {
+static int y = 0;
+}
+static int x = 0;
+
int main(int argc, char **argv) {
#pragma omp target parallel default // expected-error {{expected '(' after 'default'}}
foo();
- #pragma omp target parallel default ( // expected-error {{expected 'none' or 'shared' in OpenMP clause 'default'}} expected-error {{expected ')'}} expected-note {{to match this '('}}
+#pragma omp target parallel default( // expected-error {{expected 'none', 'shared' or 'firstprivate' in OpenMP clause 'default'}} expected-error {{expected ')'}} expected-note {{to match this '('}}
foo();
- #pragma omp target parallel default () // expected-error {{expected 'none' or 'shared' in OpenMP clause 'default'}}
+#pragma omp target parallel default() // expected-error {{expected 'none', 'shared' or 'firstprivate' in OpenMP clause 'default'}}
foo();
#pragma omp target parallel default (none // expected-error {{expected ')'}} expected-note {{to match this '('}}
foo();
#pragma omp target parallel default (shared), default(shared) // expected-error {{directive '#pragma omp target parallel' cannot contain more than one 'default' clause}}
foo();
- #pragma omp target parallel default (x) // expected-error {{expected 'none' or 'shared' in OpenMP clause 'default'}}
+#pragma omp target parallel default(x) // expected-error {{expected 'none', 'shared' or 'firstprivate' in OpenMP clause 'default'}}
foo();
#pragma omp target parallel default(none) // expected-note {{explicit data sharing attribute requested here}}
@@ -28,5 +37,14 @@ int main(int argc, char **argv) {
#pragma omp target parallel default(none) // expected-note {{explicit data sharing attribute requested here}}
#pragma omp parallel default(shared)
++argc; // expected-error {{variable 'argc' must have explicitly specified data sharing attributes}}
+
+#ifndef OMP51
+#pragma omp target parallel default(firstprivate) // expected-error {{data-sharing attribute 'firstprivate' in 'default' clause requires OpenMP version 5.1 or above}}
+ {
+ ++x;
+ ++y;
+ }
+#endif
+
return 0;
}
diff --git a/clang/test/OpenMP/target_parallel_for_default_messages.cpp b/clang/test/OpenMP/target_parallel_for_default_messages.cpp
index fc6ba43138d7..4a3aae68e086 100644
--- a/clang/test/OpenMP/target_parallel_for_default_messages.cpp
+++ b/clang/test/OpenMP/target_parallel_for_default_messages.cpp
@@ -2,17 +2,26 @@
// RUN: %clang_cc1 -verify -fopenmp-simd -ferror-limit 100 -o - %s -Wuninitialized
+// RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=51 -DOMP51 -ferror-limit 100 -o - %s -Wuninitialized
+
+// RUN: %clang_cc1 -verify -fopenmp-simd -fopenmp-version=51 -DOMP51 -ferror-limit 100 -o - %s -Wuninitialized
+
void foo();
+namespace {
+static int y = 0;
+}
+static int x = 0;
+
int main(int argc, char **argv) {
int i;
#pragma omp target parallel for default // expected-error {{expected '(' after 'default'}}
for (i = 0; i < argc; ++i)
foo();
-#pragma omp target parallel for default( // expected-error {{expected 'none' or 'shared' in OpenMP clause 'default'}} expected-error {{expected ')'}} expected-note {{to match this '('}}
+#pragma omp target parallel for default( // expected-error {{expected 'none', 'shared' or 'firstprivate' in OpenMP clause 'default'}} expected-error {{expected ')'}} expected-note {{to match this '('}}
for (i = 0; i < argc; ++i)
foo();
-#pragma omp target parallel for default() // expected-error {{expected 'none' or 'shared' in OpenMP clause 'default'}}
+#pragma omp target parallel for default() // expected-error {{expected 'none', 'shared' or 'firstprivate' in OpenMP clause 'default'}}
for (i = 0; i < argc; ++i)
foo();
#pragma omp target parallel for default(none // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-note {{explicit data sharing attribute requested here}}
@@ -21,7 +30,7 @@ int main(int argc, char **argv) {
#pragma omp target parallel for default(shared), default(shared) // expected-error {{directive '#pragma omp target parallel for' cannot contain more than one 'default' clause}}
for (i = 0; i < argc; ++i)
foo();
-#pragma omp target parallel for default(x) // expected-error {{expected 'none' or 'shared' in OpenMP clause 'default'}}
+#pragma omp target parallel for default(x) // expected-error {{expected 'none', 'shared' or 'firstprivate' in OpenMP clause 'default'}}
for (i = 0; i < argc; ++i)
foo();
@@ -34,5 +43,13 @@ int main(int argc, char **argv) {
for (i = 0; i < argc; ++i) // expected-error {{variable 'argc' must have explicitly specified data sharing attributes}}
foo();
+#ifndef OMP51
+#pragma omp target parallel for default(firstprivate) // expected-error {{data-sharing attribute 'firstprivate' in 'default' clause requires OpenMP version 5.1 or above}}
+ for (i = 0; i < argc; ++i) {
+ ++x;
+ ++y;
+ }
+#endif
+
return 0;
}
diff --git a/clang/test/OpenMP/target_parallel_for_simd_default_messages.cpp b/clang/test/OpenMP/target_parallel_for_simd_default_messages.cpp
index daa93b9c9050..48489309ef03 100644
--- a/clang/test/OpenMP/target_parallel_for_simd_default_messages.cpp
+++ b/clang/test/OpenMP/target_parallel_for_simd_default_messages.cpp
@@ -2,17 +2,26 @@
// RUN: %clang_cc1 -verify -fopenmp-simd -ferror-limit 100 -o - %s -Wuninitialized
+// RUN: %clang_cc1 -verify -fopenmp-version=51 -DOMP51 -fopenmp -ferror-limit 100 -o - %s -Wuninitialized
+
+// RUN: %clang_cc1 -verify -fopenmp-version=51 -DOMP51 -fopenmp-simd -ferror-limit 100 -o - %s -Wuninitialized
+
void foo();
+namespace {
+static int y = 0;
+}
+static int x = 0;
+
int main(int argc, char **argv) {
int i;
#pragma omp target parallel for simd default // expected-error {{expected '(' after 'default'}}
for (i = 0; i < argc; ++i)
foo();
-#pragma omp target parallel for simd default( // expected-error {{expected 'none' or 'shared' in OpenMP clause 'default'}} expected-error {{expected ')'}} expected-note {{to match this '('}}
+#pragma omp target parallel for simd default( // expected-error {{expected 'none', 'shared' or 'firstprivate' in OpenMP clause 'default'}} expected-error {{expected ')'}} expected-note {{to match this '('}}
for (i = 0; i < argc; ++i)
foo();
-#pragma omp target parallel for simd default() // expected-error {{expected 'none' or 'shared' in OpenMP clause 'default'}}
+#pragma omp target parallel for simd default() // expected-error {{expected 'none', 'shared' or 'firstprivate' in OpenMP clause 'default'}}
for (i = 0; i < argc; ++i)
foo();
#pragma omp target parallel for simd default(none // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-note {{explicit data sharing attribute requested here}}
@@ -21,7 +30,7 @@ int main(int argc, char **argv) {
#pragma omp target parallel for simd default(shared), default(shared) // expected-error {{directive '#pragma omp target parallel for simd' cannot contain more than one 'default' clause}}
for (i = 0; i < argc; ++i)
foo();
-#pragma omp target parallel for simd default(x) // expected-error {{expected 'none' or 'shared' in OpenMP clause 'default'}}
+#pragma omp target parallel for simd default(x) // expected-error {{expected 'none', 'shared' or 'firstprivate' in OpenMP clause 'default'}}
for (i = 0; i < argc; ++i)
foo();
@@ -34,5 +43,13 @@ int main(int argc, char **argv) {
for (i = 0; i < argc; ++i) // expected-error {{variable 'i' must have explicitly specified data sharing attributes}} expected-error {{variable 'argc' must have explicitly specified data sharing attributes}}
foo();
+#ifndef OMP51
+#pragma omp target parallel for simd default(firstprivate) // expected-error {{data-sharing attribute 'firstprivate' in 'default' clause requires OpenMP version 5.1 or above}}
+ for (int i = 0; i < argc; i++) {
+ ++x;
+ ++y;
+ }
+#endif
+
return 0;
}
diff --git a/clang/test/OpenMP/target_teams_default_messages.cpp b/clang/test/OpenMP/target_teams_default_messages.cpp
index 21fa8270ef6a..85c417f8f985 100644
--- a/clang/test/OpenMP/target_teams_default_messages.cpp
+++ b/clang/test/OpenMP/target_teams_default_messages.cpp
@@ -2,20 +2,29 @@
// RUN: %clang_cc1 -verify -fopenmp-simd -o - %s -Wuninitialized
+// RUN: %clang_cc1 -verify -fopenmp-version=51 -DOMP51 -fopenmp -o - %s -Wuninitialized
+
+// RUN: %clang_cc1 -verify -fopenmp-version=51 -DOMP51 -fopenmp-simd -o - %s -Wuninitialized
+
void foo();
+namespace {
+static int y = 0;
+}
+static int x = 0;
+
int main(int argc, char **argv) {
#pragma omp target teams default // expected-error {{expected '(' after 'default'}}
foo();
-#pragma omp target teams default ( // expected-error {{expected 'none' or 'shared' in OpenMP clause 'default'}} expected-error {{expected ')'}} expected-note {{to match this '('}}
+#pragma omp target teams default( // expected-error {{expected 'none', 'shared' or 'firstprivate' in OpenMP clause 'default'}} expected-error {{expected ')'}} expected-note {{to match this '('}}
foo();
-#pragma omp target teams default () // expected-error {{expected 'none' or 'shared' in OpenMP clause 'default'}}
+#pragma omp target teams default() // expected-error {{expected 'none', 'shared' or 'firstprivate' in OpenMP clause 'default'}}
foo();
#pragma omp target teams default (none // expected-error {{expected ')'}} expected-note {{to match this '('}}
foo();
#pragma omp target teams default (shared), default(shared) // expected-error {{directive '#pragma omp target teams' cannot contain more than one 'default' clause}}
foo();
-#pragma omp target teams default (x) // expected-error {{expected 'none' or 'shared' in OpenMP clause 'default'}}
+#pragma omp target teams default(x) // expected-error {{expected 'none', 'shared' or 'firstprivate' in OpenMP clause 'default'}}
foo();
#pragma omp target teams default(none) // expected-note {{explicit data sharing attribute requested here}}
@@ -24,5 +33,14 @@ int main(int argc, char **argv) {
#pragma omp target teams default(none) // expected-note {{explicit data sharing attribute requested here}}
#pragma omp parallel default(shared)
++argc; // expected-error {{variable 'argc' must have explicitly specified data sharing attributes}}
+
+#ifndef OMP51
+#pragma omp target teams default(firstprivate) // expected-error {{data-sharing attribute 'firstprivate' in 'default' clause requires OpenMP version 5.1 or above}}
+ {
+ ++x;
+ ++y;
+ }
+#endif
+
return 0;
}
diff --git a/clang/test/OpenMP/target_teams_distribute_default_messages.cpp b/clang/test/OpenMP/target_teams_distribute_default_messages.cpp
index fd834e7cba32..a490ad61385f 100644
--- a/clang/test/OpenMP/target_teams_distribute_default_messages.cpp
+++ b/clang/test/OpenMP/target_teams_distribute_default_messages.cpp
@@ -2,24 +2,41 @@
// RUN: %clang_cc1 -verify -fopenmp-simd %s -Wuninitialized
+// RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=51 -DOMP51 %s -Wuninitialized
+
+// RUN: %clang_cc1 -verify -fopenmp-simd -fopenmp-version=51 -DOMP51 %s -Wuninitialized
+
void foo();
+namespace {
+static int y = 0;
+}
+static int x = 0;
+
int main(int argc, char **argv) {
#pragma omp target teams distribute default // expected-error {{expected '(' after 'default'}}
for (int i=0; i<200; i++) foo();
- #pragma omp target teams distribute default ( // expected-error {{expected 'none' or 'shared' in OpenMP clause 'default'}} expected-error {{expected ')'}} expected-note {{to match this '('}}
+#pragma omp target teams distribute default( // expected-error {{expected 'none', 'shared' or 'firstprivate' in OpenMP clause 'default'}} expected-error {{expected ')'}} expected-note {{to match this '('}}
for (int i=0; i<200; i++) foo();
- #pragma omp target teams distribute default () // expected-error {{expected 'none' or 'shared' in OpenMP clause 'default'}}
+#pragma omp target teams distribute default() // expected-error {{expected 'none', 'shared' or 'firstprivate' in OpenMP clause 'default'}}
for (int i=0; i<200; i++) foo();
#pragma omp target teams distribute default (none // expected-error {{expected ')'}} expected-note {{to match this '('}}
for (int i=0; i<200; i++) foo();
#pragma omp target teams distribute default (shared), default(shared) // expected-error {{directive '#pragma omp target teams distribute' cannot contain more than one 'default' clause}}
for (int i=0; i<200; i++) foo();
- #pragma omp target teams distribute default (x) // expected-error {{expected 'none' or 'shared' in OpenMP clause 'default'}}
+#pragma omp target teams distribute default(x) // expected-error {{expected 'none', 'shared' or 'firstprivate' in OpenMP clause 'default'}}
for (int i=0; i<200; i++) foo();
#pragma omp target teams distribute default(none) // expected-note {{explicit data sharing attribute requested here}}
for (int i=0; i<200; i++) ++argc; // expected-error {{variable 'argc' must have explicitly specified data sharing attributes}}
+#ifndef OMP51
+#pragma omp target teams distribute default(firstprivate) // expected-error {{data-sharing attribute 'firstprivate' in 'default' clause requires OpenMP version 5.1 or above}}
+ for (int i = 0; i < 200; i++) {
+ ++x;
+ ++y;
+ }
+#endif
+
return 0;
}
diff --git a/clang/test/OpenMP/target_teams_distribute_parallel_for_default_messages.cpp b/clang/test/OpenMP/target_teams_distribute_parallel_for_default_messages.cpp
index 00e0704a6cca..2fe793136961 100644
--- a/clang/test/OpenMP/target_teams_distribute_parallel_for_default_messages.cpp
+++ b/clang/test/OpenMP/target_teams_distribute_parallel_for_default_messages.cpp
@@ -2,24 +2,41 @@
// RUN: %clang_cc1 -verify -fopenmp-simd %s -Wuninitialized
+// RUN: %clang_cc1 -verify -fopenmp-version=51 -DOMP51 -fopenmp %s -Wuninitialized
+
+// RUN: %clang_cc1 -verify -fopenmp-version=51 -DOMP51 -fopenmp-simd %s -Wuninitialized
+
void foo();
+namespace {
+static int y = 0;
+}
+static int x = 0;
+
int main(int argc, char **argv) {
#pragma omp target teams distribute parallel for default // expected-error {{expected '(' after 'default'}}
for (int i=0; i<200; i++) foo();
- #pragma omp target teams distribute parallel for default ( // expected-error {{expected 'none' or 'shared' in OpenMP clause 'default'}} expected-error {{expected ')'}} expected-note {{to match this '('}}
+#pragma omp target teams distribute parallel for default( // expected-error {{expected 'none', 'shared' or 'firstprivate' in OpenMP clause 'default'}} expected-error {{expected ')'}} expected-note {{to match this '('}}
for (int i=0; i<200; i++) foo();
-#pragma omp target teams distribute parallel for default () // expected-error {{expected 'none' or 'shared' in OpenMP clause 'default'}}
+#pragma omp target teams distribute parallel for default() // expected-error {{expected 'none', 'shared' or 'firstprivate' in OpenMP clause 'default'}}
for (int i=0; i<200; i++) foo();
#pragma omp target teams distribute parallel for default (none // expected-error {{expected ')'}} expected-note {{to match this '('}}
for (int i=0; i<200; i++) foo();
#pragma omp target teams distribute parallel for default (shared), default(shared) // expected-error {{directive '#pragma omp target teams distribute parallel for' cannot contain more than one 'default' clause}}
for (int i=0; i<200; i++) foo();
-#pragma omp target teams distribute parallel for default (x) // expected-error {{expected 'none' or 'shared' in OpenMP clause 'default'}}
+#pragma omp target teams distribute parallel for default(x) // expected-error {{expected 'none', 'shared' or 'firstprivate' in OpenMP clause 'default'}}
for (int i=0; i<200; i++) foo();
#pragma omp target teams distribute parallel for default(none) // expected-note {{explicit data sharing attribute requested here}}
for (int i=0; i<200; i++) ++argc; // expected-error {{variable 'argc' must have explicitly specified data sharing attributes}}
+#ifndef OMP51
+#pragma omp target teams distribute parallel for default(firstprivate) // expected-error {{data-sharing attribute 'firstprivate' in 'default' clause requires OpenMP version 5.1 or above}}
+ for (int i = 0; i < 200; i++) {
+ ++x;
+ ++y;
+ }
+#endif
+
return 0;
}
diff --git a/clang/test/OpenMP/target_teams_distribute_parallel_for_simd_default_messages.cpp b/clang/test/OpenMP/target_teams_distribute_parallel_for_simd_default_messages.cpp
index 7c46c964d2ec..e5ff85622250 100644
--- a/clang/test/OpenMP/target_teams_distribute_parallel_for_simd_default_messages.cpp
+++ b/clang/test/OpenMP/target_teams_distribute_parallel_for_simd_default_messages.cpp
@@ -2,16 +2,25 @@
// RUN: %clang_cc1 -verify -fopenmp-simd %s -Wuninitialized
+// RUN: %clang_cc1 -verify -fopenmp-version=51 -DOMP51 -fopenmp %s -Wuninitialized
+
+// RUN: %clang_cc1 -verify -fopenmp-version=51 -DOMP51 -fopenmp-simd %s -Wuninitialized
+
void foo();
+namespace {
+static int y = 0;
+}
+static int x = 0;
+
int main(int argc, char **argv) {
#pragma omp target teams distribute parallel for simd default // expected-error {{expected '(' after 'default'}}
for (int i=0; i<200; i++) foo();
-#pragma omp target teams distribute parallel for simd default ( // expected-error {{expected 'none' or 'shared' in OpenMP clause 'default'}} expected-error {{expected ')'}} expected-note {{to match this '('}}
+#pragma omp target teams distribute parallel for simd default( // expected-error {{expected 'none', 'shared' or 'firstprivate' in OpenMP clause 'default'}} expected-error {{expected ')'}} expected-note {{to match this '('}}
for (int i=0; i<200; i++) foo();
-#pragma omp target teams distribute parallel for simd default () // expected-error {{expected 'none' or 'shared' in OpenMP clause 'default'}}
+#pragma omp target teams distribute parallel for simd default() // expected-error {{expected 'none', 'shared' or 'firstprivate' in OpenMP clause 'default'}}
for (int i=0; i<200; i++) foo();
#pragma omp target teams distribute parallel for simd default (none // expected-error {{expected ')'}} expected-note {{to match this '('}}
@@ -20,11 +29,19 @@ int main(int argc, char **argv) {
#pragma omp target teams distribute parallel for simd default (shared), default(shared) // expected-error {{directive '#pragma omp target teams distribute parallel for simd' cannot contain more than one 'default' clause}}
for (int i=0; i<200; i++) foo();
-#pragma omp target teams distribute parallel for simd default (x) // expected-error {{expected 'none' or 'shared' in OpenMP clause 'default'}}
+#pragma omp target teams distribute parallel for simd default(x) // expected-error {{expected 'none', 'shared' or 'firstprivate' in OpenMP clause 'default'}}
for (int i=0; i<200; i++) foo();
#pragma omp target teams distribute parallel for simd default(none) // expected-note {{explicit data sharing attribute requested here}}
for (int i=0; i<200; i++) ++argc; // expected-error {{variable 'argc' must have explicitly specified data sharing attributes}}
+#ifndef OMP51
+#pragma omp target teams distribute parallel for simd default(firstprivate) // expected-error {{data-sharing attribute 'firstprivate' in 'default' clause requires OpenMP version 5.1 or above}}
+ for (int i = 0; i < argc; ++i) {
+ ++x;
+ ++y;
+ }
+#endif
+
return 0;
}
diff --git a/clang/test/OpenMP/task_default_messages.cpp b/clang/test/OpenMP/task_default_messages.cpp
index 4826c253aa04..8b6809ee05d5 100644
--- a/clang/test/OpenMP/task_default_messages.cpp
+++ b/clang/test/OpenMP/task_default_messages.cpp
@@ -2,15 +2,24 @@
// RUN: %clang_cc1 -verify -fopenmp-simd -ferror-limit 100 -o - %s -Wuninitialized
+// RUN: %clang_cc1 -verify -fopenmp-version=51 -DOMP51 -fopenmp -ferror-limit 100 -o - %s -Wuninitialized
+
+// RUN: %clang_cc1 -verify -fopenmp-version=51 -DOMP51 -fopenmp-simd -ferror-limit 100 -o - %s -Wuninitialized
+
void foo();
+namespace {
+static int y = 0;
+}
+static int x = 0;
+
int main(int argc, char **argv) {
#pragma omp task default // expected-error {{expected '(' after 'default'}}
-#pragma omp task default( // expected-error {{expected 'none' or 'shared' in OpenMP clause 'default'}} expected-error {{expected ')'}} expected-note {{to match this '('}}
-#pragma omp task default() // expected-error {{expected 'none' or 'shared' in OpenMP clause 'default'}}
+#pragma omp task default( // expected-error {{expected 'none', 'shared' or 'firstprivate' in OpenMP clause 'default'}} expected-error {{expected ')'}} expected-note {{to match this '('}}
+#pragma omp task default() // expected-error {{expected 'none', 'shared' or 'firstprivate' in OpenMP clause 'default'}}
#pragma omp task default(none // expected-error {{expected ')'}} expected-note {{to match this '('}}
#pragma omp task default(shared), default(shared) // expected-error {{directive '#pragma omp task' cannot contain more than one 'default' clause}}
-#pragma omp task default(x) // expected-error {{expected 'none' or 'shared' in OpenMP clause 'default'}}
+#pragma omp task default(x) // expected-error {{expected 'none', 'shared' or 'firstprivate' in OpenMP clause 'default'}}
foo();
#pragma omp task default(none) // expected-note {{explicit data sharing attribute requested here}}
@@ -19,5 +28,13 @@ int main(int argc, char **argv) {
#pragma omp task default(none) // expected-note {{explicit data sharing attribute requested here}}
#pragma omp task default(shared)
++argc; // expected-error {{variable 'argc' must have explicitly specified data sharing attributes}}
+
+#ifdef OMP51
+#pragma omp task default(firstprivate) // expected-note 2 {{explicit data sharing attribute requested here}}
+ {
+ ++x; // expected-error {{variable 'x' must have explicitly specified data sharing attributes}}
+ ++y; // expected-error {{variable 'y' must have explicitly specified data sharing attributes}}
+ }
+#endif
return 0;
}
diff --git a/clang/test/OpenMP/task_messages.cpp b/clang/test/OpenMP/task_messages.cpp
index 8b3183e0bd93..13cbfb6c4569 100644
--- a/clang/test/OpenMP/task_messages.cpp
+++ b/clang/test/OpenMP/task_messages.cpp
@@ -4,6 +4,9 @@
// RUN: %clang_cc1 -verify=expected,omp45 -fopenmp-version=45 -fopenmp-simd -ferror-limit 200 -std=c++11 -o - %s -Wuninitialized
// RUN: %clang_cc1 -verify=expected,omp50 -fopenmp-version=50 -fopenmp-simd -ferror-limit 200 -std=c++11 -o - %s -Wuninitialized
+// RUN: %clang_cc1 -verify=expected,omp50 -fopenmp-version=51 -DOMP51 -fopenmp -ferror-limit 100 -std=c++11 -o - %s -Wuninitialized
+// RUN: %clang_cc1 -verify=expected,omp50 -fopenmp-version=51 -DOMP51 -fopenmp-simd -ferror-limit 100 -std=c++11 -o - %s -Wuninitialized
+
void xxx(int argc) {
int x; // expected-note {{initialize the variable 'x' to silence this warning}}
#pragma omp task
@@ -16,6 +19,10 @@ void foo() {
}
typedef unsigned long omp_event_handle_t;
+namespace {
+static int y = 0;
+}
+static int x = 0;
#pragma omp task // expected-error {{unexpected OpenMP directive '#pragma omp task'}}
@@ -52,6 +59,15 @@ int foo() {
#pragma omp task default(none) // expected-note 2 {{explicit data sharing attribute requested here}}
#pragma omp task default(shared)
++a; // expected-error 2 {{variable 'a' must have explicitly specified data sharing attributes}}
+#ifdef OMP51
+#pragma omp task default(firstprivate) // expected-note 4 {{explicit data sharing attribute requested here}}
+#pragma omp task
+ {
+ ++x; // expected-error 2 {{variable 'x' must have explicitly specified data sharing attributes}}
+ ++y; // expected-error 2 {{variable 'y' must have explicitly specified data sharing attributes}}
+ }
+#endif
+
#pragma omp task default(none) // expected-note 2 {{explicit data sharing attribute requested here}}
#pragma omp task
// expected-error at +1 {{calling a private constructor of class 'S'}}
diff --git a/clang/test/OpenMP/teams_default_messages.cpp b/clang/test/OpenMP/teams_default_messages.cpp
index a02505040600..b117ef4948a0 100644
--- a/clang/test/OpenMP/teams_default_messages.cpp
+++ b/clang/test/OpenMP/teams_default_messages.cpp
@@ -2,17 +2,26 @@
// RUN: %clang_cc1 -verify -fopenmp-simd -o - %s -Wuninitialized
+// RUN: %clang_cc1 -verify -fopenmp-version=51 -DOMP51 -fopenmp -o - %s -Wuninitialized
+
+// RUN: %clang_cc1 -verify -fopenmp-version=51 -DOMP51 -fopenmp-simd -o - %s -Wuninitialized
+
void foo();
+namespace {
+static int y = 0;
+}
+static int x = 0;
+
int main(int argc, char **argv) {
#pragma omp target
#pragma omp teams default // expected-error {{expected '(' after 'default'}}
foo();
#pragma omp target
- #pragma omp teams default ( // expected-error {{expected 'none' or 'shared' in OpenMP clause 'default'}} expected-error {{expected ')'}} expected-note {{to match this '('}}
+#pragma omp teams default( // expected-error {{expected 'none', 'shared' or 'firstprivate' in OpenMP clause 'default'}} expected-error {{expected ')'}} expected-note {{to match this '('}}
foo();
#pragma omp target
- #pragma omp teams default () // expected-error {{expected 'none' or 'shared' in OpenMP clause 'default'}}
+#pragma omp teams default() // expected-error {{expected 'none', 'shared' or 'firstprivate' in OpenMP clause 'default'}}
foo();
#pragma omp target
#pragma omp teams default (none // expected-error {{expected ')'}} expected-note {{to match this '('}}
@@ -21,7 +30,7 @@ int main(int argc, char **argv) {
#pragma omp teams default (shared), default(shared) // expected-error {{directive '#pragma omp teams' cannot contain more than one 'default' clause}}
foo();
#pragma omp target
- #pragma omp teams default (x) // expected-error {{expected 'none' or 'shared' in OpenMP clause 'default'}}
+#pragma omp teams default(x) // expected-error {{expected 'none', 'shared' or 'firstprivate' in OpenMP clause 'default'}}
foo();
#pragma omp target
@@ -32,5 +41,14 @@ int main(int argc, char **argv) {
#pragma omp teams default(none) // expected-note {{explicit data sharing attribute requested here}}
#pragma omp parallel default(shared)
++argc; // expected-error {{variable 'argc' must have explicitly specified data sharing attributes}}
+
+#ifdef OMP51
+#pragma omp target
+#pragma omp teams default(firstprivate) // expected-note 2 {{explicit data sharing attribute requested here}}
+ {
+ ++x; // expected-error {{variable 'x' must have explicitly specified data sharing attributes}}
+ ++y; // expected-error {{variable 'y' must have explicitly specified data sharing attributes}}
+ }
+#endif
return 0;
}
diff --git a/clang/test/OpenMP/teams_distribute_default_messages.cpp b/clang/test/OpenMP/teams_distribute_default_messages.cpp
index 7f000208303b..1d5fd40c53a6 100644
--- a/clang/test/OpenMP/teams_distribute_default_messages.cpp
+++ b/clang/test/OpenMP/teams_distribute_default_messages.cpp
@@ -2,17 +2,26 @@
// RUN: %clang_cc1 -verify -fopenmp-simd %s -Wuninitialized
+// RUN: %clang_cc1 -verify -fopenmp-version=51 -DOMP51 -fopenmp %s -Wuninitialized
+
+// RUN: %clang_cc1 -verify -fopenmp-version=51 -DOMP51 -fopenmp-simd %s -Wuninitialized
+
void foo();
+namespace {
+static int y = 0;
+}
+static int x = 0;
+
int main(int argc, char **argv) {
#pragma omp target
#pragma omp teams distribute default // expected-error {{expected '(' after 'default'}}
for (int i=0; i<200; i++) foo();
#pragma omp target
- #pragma omp teams distribute default ( // expected-error {{expected 'none' or 'shared' in OpenMP clause 'default'}} expected-error {{expected ')'}} expected-note {{to match this '('}}
+#pragma omp teams distribute default( // expected-error {{expected 'none', 'shared' or 'firstprivate' in OpenMP clause 'default'}} expected-error {{expected ')'}} expected-note {{to match this '('}}
for (int i=0; i<200; i++) foo();
#pragma omp target
- #pragma omp teams distribute default () // expected-error {{expected 'none' or 'shared' in OpenMP clause 'default'}}
+#pragma omp teams distribute default() // expected-error {{expected 'none', 'shared' or 'firstprivate' in OpenMP clause 'default'}}
for (int i=0; i<200; i++) foo();
#pragma omp target
#pragma omp teams distribute default (none // expected-error {{expected ')'}} expected-note {{to match this '('}}
@@ -21,12 +30,21 @@ int main(int argc, char **argv) {
#pragma omp teams distribute default (shared), default(shared) // expected-error {{directive '#pragma omp teams distribute' cannot contain more than one 'default' clause}}
for (int i=0; i<200; i++) foo();
#pragma omp target
- #pragma omp teams distribute default (x) // expected-error {{expected 'none' or 'shared' in OpenMP clause 'default'}}
+#pragma omp teams distribute default(x) // expected-error {{expected 'none', 'shared' or 'firstprivate' in OpenMP clause 'default'}}
for (int i=0; i<200; i++) foo();
#pragma omp target
#pragma omp teams distribute default(none) // expected-note {{explicit data sharing attribute requested here}}
for (int i=0; i<200; i++) ++argc; // expected-error {{variable 'argc' must have explicitly specified data sharing attributes}}
+#ifdef OMP51
+#pragma omp target
+#pragma omp teams distribute default(firstprivate) // expected-note 2 {{explicit data sharing attribute requested here}}
+ for (int i = 0; i < 200; i++) {
+ ++x; // expected-error {{variable 'x' must have explicitly specified data sharing attributes}}
+ ++y; // expected-error {{variable 'y' must have explicitly specified data sharing attributes}}
+ }
+#endif
+
return 0;
}
diff --git a/clang/test/OpenMP/teams_distribute_parallel_for_default_messages.cpp b/clang/test/OpenMP/teams_distribute_parallel_for_default_messages.cpp
index 2c4662398507..3a414543be80 100644
--- a/clang/test/OpenMP/teams_distribute_parallel_for_default_messages.cpp
+++ b/clang/test/OpenMP/teams_distribute_parallel_for_default_messages.cpp
@@ -2,17 +2,26 @@
// RUN: %clang_cc1 -verify -fopenmp-simd %s -Wuninitialized
+// RUN: %clang_cc1 -verify -fopenmp-version=51 -DOMP51 -fopenmp %s -Wuninitialized
+
+// RUN: %clang_cc1 -verify -fopenmp-version=51 -DOMP51 -fopenmp-simd %s -Wuninitialized
+
void foo();
+namespace {
+static int y = 0;
+}
+static int x = 0;
+
int main(int argc, char **argv) {
#pragma omp target
#pragma omp teams distribute parallel for default // expected-error {{expected '(' after 'default'}}
for (int i=0; i<200; i++) foo();
#pragma omp target
- #pragma omp teams distribute parallel for default ( // expected-error {{expected 'none' or 'shared' in OpenMP clause 'default'}} expected-error {{expected ')'}} expected-note {{to match this '('}}
+#pragma omp teams distribute parallel for default( // expected-error {{expected 'none', 'shared' or 'firstprivate' in OpenMP clause 'default'}} expected-error {{expected ')'}} expected-note {{to match this '('}}
for (int i=0; i<200; i++) foo();
#pragma omp target
- #pragma omp teams distribute parallel for default () // expected-error {{expected 'none' or 'shared' in OpenMP clause 'default'}}
+#pragma omp teams distribute parallel for default() // expected-error {{expected 'none', 'shared' or 'firstprivate' in OpenMP clause 'default'}}
for (int i=0; i<200; i++) foo();
#pragma omp target
#pragma omp teams distribute parallel for default (none // expected-error {{expected ')'}} expected-note {{to match this '('}}
@@ -21,12 +30,21 @@ int main(int argc, char **argv) {
#pragma omp teams distribute parallel for default (shared), default(shared) // expected-error {{directive '#pragma omp teams distribute parallel for' cannot contain more than one 'default' clause}}
for (int i=0; i<200; i++) foo();
#pragma omp target
- #pragma omp teams distribute parallel for default (x) // expected-error {{expected 'none' or 'shared' in OpenMP clause 'default'}}
+#pragma omp teams distribute parallel for default(x) // expected-error {{expected 'none', 'shared' or 'firstprivate' in OpenMP clause 'default'}}
for (int i=0; i<200; i++) foo();
#pragma omp target
#pragma omp teams distribute parallel for default(none) // expected-note {{explicit data sharing attribute requested here}}
for (int i=0; i<200; i++) ++argc; // expected-error {{variable 'argc' must have explicitly specified data sharing attributes}}
+#ifdef OMP51
+#pragma omp target
+#pragma omp teams distribute parallel for default(firstprivate) // expected-note 2 {{explicit data sharing attribute requested here}}
+ for (int i = 0; i < 200; i++) {
+ ++x; // expected-error {{variable 'x' must have explicitly specified data sharing attributes}}
+ ++y; // expected-error {{variable 'y' must have explicitly specified data sharing attributes}}
+ }
+#endif
+
return 0;
}
diff --git a/clang/test/OpenMP/teams_distribute_parallel_for_simd_default_messages.cpp b/clang/test/OpenMP/teams_distribute_parallel_for_simd_default_messages.cpp
index 93017a8233ff..ce7f35b47959 100644
--- a/clang/test/OpenMP/teams_distribute_parallel_for_simd_default_messages.cpp
+++ b/clang/test/OpenMP/teams_distribute_parallel_for_simd_default_messages.cpp
@@ -2,17 +2,26 @@
// RUN: %clang_cc1 -verify -fopenmp-simd %s -Wuninitialized
+// RUN: %clang_cc1 -verify -fopenmp %s -Wuninitialized -fopenmp-version=51 -DOMP51
+
+// RUN: %clang_cc1 -verify -fopenmp-simd %s -Wuninitialized -fopenmp-version=51 -DOMP51
+
void foo();
+namespace {
+static int y = 0;
+}
+static int x = 0;
+
int main(int argc, char **argv) {
#pragma omp target
#pragma omp teams distribute parallel for simd default // expected-error {{expected '(' after 'default'}}
for (int i=0; i<200; i++) foo();
#pragma omp target
- #pragma omp teams distribute parallel for simd default ( // expected-error {{expected 'none' or 'shared' in OpenMP clause 'default'}} expected-error {{expected ')'}} expected-note {{to match this '('}}
+#pragma omp teams distribute parallel for simd default( // expected-error {{expected 'none', 'shared' or 'firstprivate' in OpenMP clause 'default'}} expected-error {{expected ')'}} expected-note {{to match this '('}}
for (int i=0; i<200; i++) foo();
#pragma omp target
- #pragma omp teams distribute parallel for simd default () // expected-error {{expected 'none' or 'shared' in OpenMP clause 'default'}}
+#pragma omp teams distribute parallel for simd default() // expected-error {{expected 'none', 'shared' or 'firstprivate' in OpenMP clause 'default'}}
for (int i=0; i<200; i++) foo();
#pragma omp target
#pragma omp teams distribute parallel for simd default (none // expected-error {{expected ')'}} expected-note {{to match this '('}}
@@ -21,12 +30,20 @@ int main(int argc, char **argv) {
#pragma omp teams distribute parallel for simd default (shared), default(shared) // expected-error {{directive '#pragma omp teams distribute parallel for simd' cannot contain more than one 'default' clause}}
for (int i=0; i<200; i++) foo();
#pragma omp target
- #pragma omp teams distribute parallel for simd default (x) // expected-error {{expected 'none' or 'shared' in OpenMP clause 'default'}}
+#pragma omp teams distribute parallel for simd default(x) // expected-error {{expected 'none', 'shared' or 'firstprivate' in OpenMP clause 'default'}}
for (int i=0; i<200; i++) foo();
#pragma omp target
#pragma omp teams distribute parallel for simd default(none) // expected-note {{explicit data sharing attribute requested here}}
for (int i=0; i<200; i++) ++argc; // expected-error {{variable 'argc' must have explicitly specified data sharing attributes}}
+#ifdef OpenMP51
+#pragma omp teams distribute parallel for default(firstprivate) // expected-note 2 {{explicit data sharing attribute requested here}}
+ for (int i = 0; i < 200; i++) {
+ ++x; // expected-error {{variable 'x' must have explicitly specified data sharing attributes}}
+ ++y; // expected-error {{variable 'y' must have explicitly specified data sharing attributes}}
+ }
+#endif
+
return 0;
}
diff --git a/clang/test/OpenMP/teams_distribute_simd_default_messages.cpp b/clang/test/OpenMP/teams_distribute_simd_default_messages.cpp
index 2775210ae048..11f5d1cd1fc8 100644
--- a/clang/test/OpenMP/teams_distribute_simd_default_messages.cpp
+++ b/clang/test/OpenMP/teams_distribute_simd_default_messages.cpp
@@ -1,18 +1,23 @@
-// RUN: %clang_cc1 -verify -fopenmp %s -Wuninitialized
+// RUN: %clang_cc1 -verify -fopenmp %s -Wuninitialized -fopenmp-version=51
-// RUN: %clang_cc1 -verify -fopenmp-simd %s -Wuninitialized
+// RUN: %clang_cc1 -verify -fopenmp-simd %s -Wuninitialized -fopenmp-version=51
void foo();
+namespace {
+static int y = 0;
+}
+static int x = 0;
+
int main(int argc, char **argv) {
#pragma omp target
#pragma omp teams distribute simd default // expected-error {{expected '(' after 'default'}}
for (int i=0; i<200; i++) foo();
#pragma omp target
- #pragma omp teams distribute simd default ( // expected-error {{expected 'none' or 'shared' in OpenMP clause 'default'}} expected-error {{expected ')'}} expected-note {{to match this '('}}
+#pragma omp teams distribute simd default( // expected-error {{expected 'none', 'shared' or 'firstprivate' in OpenMP clause 'default'}} expected-error {{expected ')'}} expected-note {{to match this '('}}
for (int i=0; i<200; i++) foo();
#pragma omp target
- #pragma omp teams distribute simd default () // expected-error {{expected 'none' or 'shared' in OpenMP clause 'default'}}
+#pragma omp teams distribute simd default() // expected-error {{expected 'none', 'shared' or 'firstprivate' in OpenMP clause 'default'}}
for (int i=0; i<200; i++) foo();
#pragma omp target
#pragma omp teams distribute simd default (none // expected-error {{expected ')'}} expected-note {{to match this '('}}
@@ -21,12 +26,22 @@ int main(int argc, char **argv) {
#pragma omp teams distribute simd default (shared), default(shared) // expected-error {{directive '#pragma omp teams distribute simd' cannot contain more than one 'default' clause}}
for (int i=0; i<200; i++) foo();
#pragma omp target
- #pragma omp teams distribute simd default (x) // expected-error {{expected 'none' or 'shared' in OpenMP clause 'default'}}
+#pragma omp teams distribute simd default(x) // expected-error {{expected 'none', 'shared' or 'firstprivate' in OpenMP clause 'default'}}
for (int i=0; i<200; i++) foo();
#pragma omp target
#pragma omp teams distribute simd default(none) // expected-note {{explicit data sharing attribute requested here}}
for (int i=0; i<200; i++) ++argc; // expected-error {{variable 'argc' must have explicitly specified data sharing attributes}}
+#pragma omp target
+#pragma omp teams distribute simd default(firstprivate) // expected-note {{explicit data sharing attribute requested here}}
+ for (int i = 0; i < 200; i++)
+ ++x; // expected-error {{variable 'x' must have explicitly specified data sharing attributes}}
+
+#pragma omp target
+#pragma omp teams distribute simd default(firstprivate) // expected-note {{explicit data sharing attribute requested here}}
+ for (int i = 0; i < 200; i++)
+ ++y; // expected-error {{variable 'y' must have explicitly specified data sharing attributes}}
+
return 0;
}
diff --git a/clang/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp b/clang/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp
index aeb4fd098d22..687908043a8d 100644
--- a/clang/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp
+++ b/clang/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp
@@ -103,9 +103,9 @@ TEST(IsExpandedFromMacro, ShouldMatchFromCommandLine) {
StringRef input = R"cc(
void Test() { FOUR_PLUS_FOUR; }
)cc";
- EXPECT_TRUE(matchesConditionally(input,
- binaryOperator(isExpandedFromMacro("FOUR_PLUS_FOUR")),
- true, {"-std=c++11", "-DFOUR_PLUS_FOUR=4+4"}));
+ EXPECT_TRUE(matchesConditionally(
+ input, binaryOperator(isExpandedFromMacro("FOUR_PLUS_FOUR")), true,
+ {"-std=c++11", "-DFOUR_PLUS_FOUR=4+4"}));
}
TEST(IsExpandedFromMacro, ShouldNotMatchBeginOnly) {
@@ -143,31 +143,31 @@ TEST(IsExpandedFromMacro, ShouldNotMatchDifferentInstances) {
}
TEST(AllOf, AllOverloadsWork) {
- const char Program[] =
- "struct T { };"
- "int f(int, T*, int, int);"
- "void g(int x) { T t; f(x, &t, 3, 4); }";
- EXPECT_TRUE(matches(Program,
- callExpr(allOf(callee(functionDecl(hasName("f"))),
- hasArgument(0, declRefExpr(to(varDecl())))))));
- EXPECT_TRUE(matches(Program,
- callExpr(allOf(callee(functionDecl(hasName("f"))),
- hasArgument(0, declRefExpr(to(varDecl()))),
- hasArgument(1, hasType(pointsTo(
- recordDecl(hasName("T")))))))));
- EXPECT_TRUE(matches(Program,
- callExpr(allOf(callee(functionDecl(hasName("f"))),
- hasArgument(0, declRefExpr(to(varDecl()))),
- hasArgument(1, hasType(pointsTo(
- recordDecl(hasName("T"))))),
- hasArgument(2, integerLiteral(equals(3)))))));
- EXPECT_TRUE(matches(Program,
- callExpr(allOf(callee(functionDecl(hasName("f"))),
- hasArgument(0, declRefExpr(to(varDecl()))),
- hasArgument(1, hasType(pointsTo(
- recordDecl(hasName("T"))))),
- hasArgument(2, integerLiteral(equals(3))),
- hasArgument(3, integerLiteral(equals(4)))))));
+ const char Program[] = "struct T { };"
+ "int f(int, T*, int, int);"
+ "void g(int x) { T t; f(x, &t, 3, 4); }";
+ EXPECT_TRUE(matches(
+ Program, callExpr(allOf(callee(functionDecl(hasName("f"))),
+ hasArgument(0, declRefExpr(to(varDecl())))))));
+ EXPECT_TRUE(matches(
+ Program,
+ callExpr(
+ allOf(callee(functionDecl(hasName("f"))),
+ hasArgument(0, declRefExpr(to(varDecl()))),
+ hasArgument(1, hasType(pointsTo(recordDecl(hasName("T")))))))));
+ EXPECT_TRUE(matches(
+ Program, callExpr(allOf(
+ callee(functionDecl(hasName("f"))),
+ hasArgument(0, declRefExpr(to(varDecl()))),
+ hasArgument(1, hasType(pointsTo(recordDecl(hasName("T"))))),
+ hasArgument(2, integerLiteral(equals(3)))))));
+ EXPECT_TRUE(matches(
+ Program, callExpr(allOf(
+ callee(functionDecl(hasName("f"))),
+ hasArgument(0, declRefExpr(to(varDecl()))),
+ hasArgument(1, hasType(pointsTo(recordDecl(hasName("T"))))),
+ hasArgument(2, integerLiteral(equals(3))),
+ hasArgument(3, integerLiteral(equals(4)))))));
}
TEST(DeclarationMatcher, MatchHas) {
@@ -176,127 +176,103 @@ TEST(DeclarationMatcher, MatchHas) {
EXPECT_TRUE(matches("class X {};", HasClassX));
DeclarationMatcher YHasClassX =
- recordDecl(hasName("Y"), has(recordDecl(hasName("X"))));
+ recordDecl(hasName("Y"), has(recordDecl(hasName("X"))));
EXPECT_TRUE(matches("class Y { class X {}; };", YHasClassX));
EXPECT_TRUE(notMatches("class X {};", YHasClassX));
- EXPECT_TRUE(
- notMatches("class Y { class Z { class X {}; }; };", YHasClassX));
+ EXPECT_TRUE(notMatches("class Y { class Z { class X {}; }; };", YHasClassX));
}
TEST(DeclarationMatcher, MatchHasRecursiveAllOf) {
DeclarationMatcher Recursive =
- recordDecl(
- has(recordDecl(
- has(recordDecl(hasName("X"))),
- has(recordDecl(hasName("Y"))),
- hasName("Z"))),
- has(recordDecl(
- has(recordDecl(hasName("A"))),
- has(recordDecl(hasName("B"))),
- hasName("C"))),
- hasName("F"));
-
- EXPECT_TRUE(matches(
- "class F {"
- " class Z {"
- " class X {};"
- " class Y {};"
- " };"
- " class C {"
- " class A {};"
- " class B {};"
- " };"
- "};", Recursive));
-
- EXPECT_TRUE(matches(
- "class F {"
- " class Z {"
- " class A {};"
- " class X {};"
- " class Y {};"
- " };"
- " class C {"
- " class X {};"
- " class A {};"
- " class B {};"
- " };"
- "};", Recursive));
-
- EXPECT_TRUE(matches(
- "class O1 {"
- " class O2 {"
- " class F {"
- " class Z {"
- " class A {};"
- " class X {};"
- " class Y {};"
- " };"
- " class C {"
- " class X {};"
- " class A {};"
- " class B {};"
- " };"
- " };"
- " };"
- "};", Recursive));
+ recordDecl(has(recordDecl(has(recordDecl(hasName("X"))),
+ has(recordDecl(hasName("Y"))), hasName("Z"))),
+ has(recordDecl(has(recordDecl(hasName("A"))),
+ has(recordDecl(hasName("B"))), hasName("C"))),
+ hasName("F"));
+
+ EXPECT_TRUE(matches("class F {"
+ " class Z {"
+ " class X {};"
+ " class Y {};"
+ " };"
+ " class C {"
+ " class A {};"
+ " class B {};"
+ " };"
+ "};",
+ Recursive));
+
+ EXPECT_TRUE(matches("class F {"
+ " class Z {"
+ " class A {};"
+ " class X {};"
+ " class Y {};"
+ " };"
+ " class C {"
+ " class X {};"
+ " class A {};"
+ " class B {};"
+ " };"
+ "};",
+ Recursive));
+
+ EXPECT_TRUE(matches("class O1 {"
+ " class O2 {"
+ " class F {"
+ " class Z {"
+ " class A {};"
+ " class X {};"
+ " class Y {};"
+ " };"
+ " class C {"
+ " class X {};"
+ " class A {};"
+ " class B {};"
+ " };"
+ " };"
+ " };"
+ "};",
+ Recursive));
}
TEST(DeclarationMatcher, MatchHasRecursiveAnyOf) {
- DeclarationMatcher Recursive =
- recordDecl(
- anyOf(
- has(recordDecl(
- anyOf(
- has(recordDecl(
- hasName("X"))),
- has(recordDecl(
- hasName("Y"))),
- hasName("Z")))),
- has(recordDecl(
- anyOf(
- hasName("C"),
- has(recordDecl(
- hasName("A"))),
- has(recordDecl(
- hasName("B")))))),
- hasName("F")));
+ DeclarationMatcher Recursive = recordDecl(
+ anyOf(has(recordDecl(anyOf(has(recordDecl(hasName("X"))),
+ has(recordDecl(hasName("Y"))), hasName("Z")))),
+ has(recordDecl(anyOf(hasName("C"), has(recordDecl(hasName("A"))),
+ has(recordDecl(hasName("B")))))),
+ hasName("F")));
EXPECT_TRUE(matches("class F {};", Recursive));
EXPECT_TRUE(matches("class Z {};", Recursive));
EXPECT_TRUE(matches("class C {};", Recursive));
EXPECT_TRUE(matches("class M { class N { class X {}; }; };", Recursive));
EXPECT_TRUE(matches("class M { class N { class B {}; }; };", Recursive));
- EXPECT_TRUE(
- matches("class O1 { class O2 {"
- " class M { class N { class B {}; }; }; "
- "}; };", Recursive));
+ EXPECT_TRUE(matches("class O1 { class O2 {"
+ " class M { class N { class B {}; }; }; "
+ "}; };",
+ Recursive));
}
TEST(DeclarationMatcher, MatchNot) {
DeclarationMatcher NotClassX =
- cxxRecordDecl(
- isDerivedFrom("Y"),
- unless(hasName("X")));
+ cxxRecordDecl(isDerivedFrom("Y"), unless(hasName("X")));
EXPECT_TRUE(notMatches("", NotClassX));
EXPECT_TRUE(notMatches("class Y {};", NotClassX));
EXPECT_TRUE(matches("class Y {}; class Z : public Y {};", NotClassX));
EXPECT_TRUE(notMatches("class Y {}; class X : public Y {};", NotClassX));
EXPECT_TRUE(
- notMatches("class Y {}; class Z {}; class X : public Y {};",
- NotClassX));
+ notMatches("class Y {}; class Z {}; class X : public Y {};", NotClassX));
DeclarationMatcher ClassXHasNotClassY =
- recordDecl(
- hasName("X"),
- has(recordDecl(hasName("Z"))),
- unless(
- has(recordDecl(hasName("Y")))));
+ recordDecl(hasName("X"), has(recordDecl(hasName("Z"))),
+ unless(has(recordDecl(hasName("Y")))));
EXPECT_TRUE(matches("class X { class Z {}; };", ClassXHasNotClassY));
- EXPECT_TRUE(notMatches("class X { class Y {}; class Z {}; };",
- ClassXHasNotClassY));
+ EXPECT_TRUE(
+ notMatches("class X { class Y {}; class Z {}; };", ClassXHasNotClassY));
DeclarationMatcher NamedNotRecord =
- namedDecl(hasName("Foo"), unless(recordDecl()));
+ namedDecl(hasName("Foo"), unless(recordDecl()));
EXPECT_TRUE(matches("void Foo(){}", NamedNotRecord));
EXPECT_TRUE(notMatches("struct Foo {};", NamedNotRecord));
}
@@ -318,67 +294,61 @@ TEST(CastExpression, HasCastKind) {
TEST(DeclarationMatcher, HasDescendant) {
DeclarationMatcher ZDescendantClassX =
- recordDecl(
- hasDescendant(recordDecl(hasName("X"))),
- hasName("Z"));
+ recordDecl(hasDescendant(recordDecl(hasName("X"))), hasName("Z"));
EXPECT_TRUE(matches("class Z { class X {}; };", ZDescendantClassX));
EXPECT_TRUE(
- matches("class Z { class Y { class X {}; }; };", ZDescendantClassX));
+ matches("class Z { class Y { class X {}; }; };", ZDescendantClassX));
+ EXPECT_TRUE(matches("class Z { class A { class Y { class X {}; }; }; };",
+ ZDescendantClassX));
EXPECT_TRUE(
- matches("class Z { class A { class Y { class X {}; }; }; };",
- ZDescendantClassX));
- EXPECT_TRUE(
- matches("class Z { class A { class B { class Y { class X {}; }; }; }; };",
- ZDescendantClassX));
+ matches("class Z { class A { class B { class Y { class X {}; }; }; }; };",
+ ZDescendantClassX));
EXPECT_TRUE(notMatches("class Z {};", ZDescendantClassX));
- DeclarationMatcher ZDescendantClassXHasClassY =
- recordDecl(
- hasDescendant(recordDecl(has(recordDecl(hasName("Y"))),
- hasName("X"))),
+ DeclarationMatcher ZDescendantClassXHasClassY = recordDecl(
+ hasDescendant(recordDecl(has(recordDecl(hasName("Y"))), hasName("X"))),
hasName("Z"));
EXPECT_TRUE(matches("class Z { class X { class Y {}; }; };",
ZDescendantClassXHasClassY));
EXPECT_TRUE(
- matches("class Z { class A { class B { class X { class Y {}; }; }; }; };",
- ZDescendantClassXHasClassY));
- EXPECT_TRUE(notMatches(
- "class Z {"
- " class A {"
- " class B {"
- " class X {"
- " class C {"
- " class Y {};"
- " };"
- " };"
- " }; "
- " };"
- "};", ZDescendantClassXHasClassY));
+ matches("class Z { class A { class B { class X { class Y {}; }; }; }; };",
+ ZDescendantClassXHasClassY));
+ EXPECT_TRUE(notMatches("class Z {"
+ " class A {"
+ " class B {"
+ " class X {"
+ " class C {"
+ " class Y {};"
+ " };"
+ " };"
+ " }; "
+ " };"
+ "};",
+ ZDescendantClassXHasClassY));
DeclarationMatcher ZDescendantClassXDescendantClassY =
- recordDecl(
- hasDescendant(recordDecl(hasDescendant(recordDecl(hasName("Y"))),
- hasName("X"))),
- hasName("Z"));
- EXPECT_TRUE(
- matches("class Z { class A { class X { class B { class Y {}; }; }; }; };",
- ZDescendantClassXDescendantClassY));
- EXPECT_TRUE(matches(
- "class Z {"
- " class A {"
- " class X {"
- " class B {"
- " class Y {};"
- " };"
- " class Y {};"
- " };"
- " };"
- "};", ZDescendantClassXDescendantClassY));
+ recordDecl(hasDescendant(recordDecl(
+ hasDescendant(recordDecl(hasName("Y"))), hasName("X"))),
+ hasName("Z"));
+ EXPECT_TRUE(
+ matches("class Z { class A { class X { class B { class Y {}; }; }; }; };",
+ ZDescendantClassXDescendantClassY));
+ EXPECT_TRUE(matches("class Z {"
+ " class A {"
+ " class X {"
+ " class B {"
+ " class Y {};"
+ " };"
+ " class Y {};"
+ " };"
+ " };"
+ "};",
+ ZDescendantClassXDescendantClassY));
}
TEST(DeclarationMatcher, HasDescendantMemoization) {
DeclarationMatcher CannotMemoize =
- decl(hasDescendant(typeLoc().bind("x")), has(decl()));
+ decl(hasDescendant(typeLoc().bind("x")), has(decl()));
EXPECT_TRUE(matches("void f() { int i; }", CannotMemoize));
}
@@ -401,39 +371,36 @@ TEST(DeclarationMatcher, HasAncestorMemoization) {
// That node can't be memoized so we have to check for it before trying to put
// it on the cache.
DeclarationMatcher CannotMemoize = classTemplateSpecializationDecl(
- hasAnyTemplateArgument(templateArgument().bind("targ")),
- forEach(fieldDecl(hasAncestor(forStmt()))));
+ hasAnyTemplateArgument(templateArgument().bind("targ")),
+ forEach(fieldDecl(hasAncestor(forStmt()))));
EXPECT_TRUE(notMatches("template <typename T> struct S;"
- "template <> struct S<int>{ int i; int j; };",
+ "template <> struct S<int>{ int i; int j; };",
CannotMemoize));
}
TEST(DeclarationMatcher, HasAttr) {
EXPECT_TRUE(matches("struct __attribute__((warn_unused)) X {};",
decl(hasAttr(clang::attr::WarnUnused))));
- EXPECT_FALSE(matches("struct X {};",
- decl(hasAttr(clang::attr::WarnUnused))));
+ EXPECT_FALSE(matches("struct X {};", decl(hasAttr(clang::attr::WarnUnused))));
}
-
TEST(DeclarationMatcher, MatchAnyOf) {
DeclarationMatcher YOrZDerivedFromX = cxxRecordDecl(
- anyOf(hasName("Y"), allOf(isDerivedFrom("X"), hasName("Z"))));
+ anyOf(hasName("Y"), allOf(isDerivedFrom("X"), hasName("Z"))));
EXPECT_TRUE(matches("class X {}; class Z : public X {};", YOrZDerivedFromX));
EXPECT_TRUE(matches("class Y {};", YOrZDerivedFromX));
EXPECT_TRUE(
- notMatches("class X {}; class W : public X {};", YOrZDerivedFromX));
+ notMatches("class X {}; class W : public X {};", YOrZDerivedFromX));
EXPECT_TRUE(notMatches("class Z {};", YOrZDerivedFromX));
DeclarationMatcher XOrYOrZOrU =
- recordDecl(anyOf(hasName("X"), hasName("Y"), hasName("Z"), hasName("U")));
+ recordDecl(anyOf(hasName("X"), hasName("Y"), hasName("Z"), hasName("U")));
EXPECT_TRUE(matches("class X {};", XOrYOrZOrU));
EXPECT_TRUE(notMatches("class V {};", XOrYOrZOrU));
- DeclarationMatcher XOrYOrZOrUOrV =
- recordDecl(anyOf(hasName("X"), hasName("Y"), hasName("Z"), hasName("U"),
- hasName("V")));
+ DeclarationMatcher XOrYOrZOrUOrV = recordDecl(anyOf(
+ hasName("X"), hasName("Y"), hasName("Z"), hasName("U"), hasName("V")));
EXPECT_TRUE(matches("class X {};", XOrYOrZOrUOrV));
EXPECT_TRUE(matches("class Y {};", XOrYOrZOrUOrV));
EXPECT_TRUE(matches("class Z {};", XOrYOrZOrUOrV));
@@ -447,8 +414,8 @@ TEST(DeclarationMatcher, MatchAnyOf) {
EXPECT_TRUE(notMatches("int F() { return 1; }", MixedTypes));
EXPECT_TRUE(
- matches("void f() try { } catch (int) { } catch (...) { }",
- cxxCatchStmt(anyOf(hasDescendant(varDecl()), isCatchAll()))));
+ matches("void f() try { } catch (int) { } catch (...) { }",
+ cxxCatchStmt(anyOf(hasDescendant(varDecl()), isCatchAll()))));
}
TEST(DeclarationMatcher, ClassIsDerived) {
@@ -460,19 +427,17 @@ TEST(DeclarationMatcher, ClassIsDerived) {
EXPECT_TRUE(notMatches("class Y;", IsDerivedFromX));
EXPECT_TRUE(notMatches("", IsDerivedFromX));
EXPECT_TRUE(matches("class X {}; template<int N> class Y : Y<N-1>, X {};",
- IsDerivedFromX));
+ IsDerivedFromX));
EXPECT_TRUE(matches("class X {}; template<int N> class Y : X, Y<N-1> {};",
- IsDerivedFromX));
+ IsDerivedFromX));
- DeclarationMatcher IsZDerivedFromX = cxxRecordDecl(hasName("Z"),
- isDerivedFrom("X"));
- EXPECT_TRUE(
- matches(
- "class X {};"
- "template<int N> class Y : Y<N-1> {};"
- "template<> class Y<0> : X {};"
- "class Z : Y<1> {};",
- IsZDerivedFromX));
+ DeclarationMatcher IsZDerivedFromX =
+ cxxRecordDecl(hasName("Z"), isDerivedFrom("X"));
+ EXPECT_TRUE(matches("class X {};"
+ "template<int N> class Y : Y<N-1> {};"
+ "template<> class Y<0> : X {};"
+ "class Z : Y<1> {};",
+ IsZDerivedFromX));
DeclarationMatcher IsDirectlyDerivedFromX =
cxxRecordDecl(isDirectlyDerivedFrom("X"));
@@ -493,145 +458,138 @@ TEST(DeclarationMatcher, ClassIsDerived) {
EXPECT_TRUE(notMatches("", IsAX));
DeclarationMatcher ZIsDerivedFromX =
- cxxRecordDecl(hasName("Z"), isDerivedFrom("X"));
+ cxxRecordDecl(hasName("Z"), isDerivedFrom("X"));
DeclarationMatcher ZIsDirectlyDerivedFromX =
cxxRecordDecl(hasName("Z"), isDirectlyDerivedFrom("X"));
EXPECT_TRUE(
- matches("class X {}; class Y : public X {}; class Z : public Y {};",
- ZIsDerivedFromX));
+ matches("class X {}; class Y : public X {}; class Z : public Y {};",
+ ZIsDerivedFromX));
EXPECT_TRUE(
notMatches("class X {}; class Y : public X {}; class Z : public Y {};",
ZIsDirectlyDerivedFromX));
- EXPECT_TRUE(
- matches("class X {};"
- "template<class T> class Y : public X {};"
- "class Z : public Y<int> {};", ZIsDerivedFromX));
+ EXPECT_TRUE(matches("class X {};"
+ "template<class T> class Y : public X {};"
+ "class Z : public Y<int> {};",
+ ZIsDerivedFromX));
EXPECT_TRUE(notMatches("class X {};"
"template<class T> class Y : public X {};"
"class Z : public Y<int> {};",
ZIsDirectlyDerivedFromX));
EXPECT_TRUE(matches("class X {}; template<class T> class Z : public X {};",
ZIsDerivedFromX));
+ EXPECT_TRUE(matches("template<class T> class X {}; "
+ "template<class T> class Z : public X<T> {};",
+ ZIsDerivedFromX));
+ EXPECT_TRUE(matches("template<class T, class U=T> class X {}; "
+ "template<class T> class Z : public X<T> {};",
+ ZIsDerivedFromX));
EXPECT_TRUE(
- matches("template<class T> class X {}; "
- "template<class T> class Z : public X<T> {};",
- ZIsDerivedFromX));
- EXPECT_TRUE(
- matches("template<class T, class U=T> class X {}; "
- "template<class T> class Z : public X<T> {};",
- ZIsDerivedFromX));
- EXPECT_TRUE(
- notMatches("template<class X> class A { class Z : public X {}; };",
- ZIsDerivedFromX));
+ notMatches("template<class X> class A { class Z : public X {}; };",
+ ZIsDerivedFromX));
EXPECT_TRUE(
- matches("template<class X> class A { public: class Z : public X {}; }; "
- "class X{}; void y() { A<X>::Z z; }", ZIsDerivedFromX));
+ matches("template<class X> class A { public: class Z : public X {}; }; "
+ "class X{}; void y() { A<X>::Z z; }",
+ ZIsDerivedFromX));
EXPECT_TRUE(
- matches("template <class T> class X {}; "
+ matches("template <class T> class X {}; "
"template<class Y> class A { class Z : public X<Y> {}; };",
- ZIsDerivedFromX));
- EXPECT_TRUE(
- notMatches("template<template<class T> class X> class A { "
- " class Z : public X<int> {}; };", ZIsDerivedFromX));
- EXPECT_TRUE(
- matches("template<template<class T> class X> class A { "
- " public: class Z : public X<int> {}; }; "
- "template<class T> class X {}; void y() { A<X>::Z z; }",
- ZIsDerivedFromX));
- EXPECT_TRUE(
- notMatches("template<class X> class A { class Z : public X::D {}; };",
- ZIsDerivedFromX));
- EXPECT_TRUE(
- matches("template<class X> class A { public: "
- " class Z : public X::D {}; }; "
- "class Y { public: class X {}; typedef X D; }; "
- "void y() { A<Y>::Z z; }", ZIsDerivedFromX));
- EXPECT_TRUE(
- matches("class X {}; typedef X Y; class Z : public Y {};",
- ZIsDerivedFromX));
+ ZIsDerivedFromX));
+ EXPECT_TRUE(notMatches("template<template<class T> class X> class A { "
+ " class Z : public X<int> {}; };",
+ ZIsDerivedFromX));
+ EXPECT_TRUE(matches("template<template<class T> class X> class A { "
+ " public: class Z : public X<int> {}; }; "
+ "template<class T> class X {}; void y() { A<X>::Z z; }",
+ ZIsDerivedFromX));
EXPECT_TRUE(
- matches("template<class T> class Y { typedef typename T::U X; "
- " class Z : public X {}; };", ZIsDerivedFromX));
- EXPECT_TRUE(matches("class X {}; class Z : public ::X {};",
+ notMatches("template<class X> class A { class Z : public X::D {}; };",
+ ZIsDerivedFromX));
+ EXPECT_TRUE(matches("template<class X> class A { public: "
+ " class Z : public X::D {}; }; "
+ "class Y { public: class X {}; typedef X D; }; "
+ "void y() { A<Y>::Z z; }",
ZIsDerivedFromX));
+ EXPECT_TRUE(matches("class X {}; typedef X Y; class Z : public Y {};",
+ ZIsDerivedFromX));
+ EXPECT_TRUE(matches("template<class T> class Y { typedef typename T::U X; "
+ " class Z : public X {}; };",
+ ZIsDerivedFromX));
+ EXPECT_TRUE(matches("class X {}; class Z : public ::X {};", ZIsDerivedFromX));
EXPECT_TRUE(
- notMatches("template<class T> class X {}; "
+ notMatches("template<class T> class X {}; "
"template<class T> class A { class Z : public X<T>::D {}; };",
- ZIsDerivedFromX));
+ ZIsDerivedFromX));
EXPECT_TRUE(
- matches("template<class T> class X { public: typedef X<T> D; }; "
+ matches("template<class T> class X { public: typedef X<T> D; }; "
"template<class T> class A { public: "
" class Z : public X<T>::D {}; }; void y() { A<int>::Z z; }",
- ZIsDerivedFromX));
+ ZIsDerivedFromX));
EXPECT_TRUE(
- notMatches("template<class X> class A { class Z : public X::D::E {}; };",
- ZIsDerivedFromX));
+ notMatches("template<class X> class A { class Z : public X::D::E {}; };",
+ ZIsDerivedFromX));
EXPECT_TRUE(
- matches("class X {}; typedef X V; typedef V W; class Z : public W {};",
- ZIsDerivedFromX));
- EXPECT_TRUE(
- matches("class X {}; class Y : public X {}; "
- "typedef Y V; typedef V W; class Z : public W {};",
- ZIsDerivedFromX));
+ matches("class X {}; typedef X V; typedef V W; class Z : public W {};",
+ ZIsDerivedFromX));
+ EXPECT_TRUE(matches("class X {}; class Y : public X {}; "
+ "typedef Y V; typedef V W; class Z : public W {};",
+ ZIsDerivedFromX));
EXPECT_TRUE(notMatches("class X {}; class Y : public X {}; "
"typedef Y V; typedef V W; class Z : public W {};",
ZIsDirectlyDerivedFromX));
EXPECT_TRUE(
- matches("template<class T, class U> class X {}; "
+ matches("template<class T, class U> class X {}; "
"template<class T> class A { class Z : public X<T, int> {}; };",
- ZIsDerivedFromX));
+ ZIsDerivedFromX));
EXPECT_TRUE(
- notMatches("template<class X> class D { typedef X A; typedef A B; "
+ notMatches("template<class X> class D { typedef X A; typedef A B; "
" typedef B C; class Z : public C {}; };",
- ZIsDerivedFromX));
- EXPECT_TRUE(
- matches("class X {}; typedef X A; typedef A B; "
- "class Z : public B {};", ZIsDerivedFromX));
- EXPECT_TRUE(
- matches("class X {}; typedef X A; typedef A B; typedef B C; "
- "class Z : public C {};", ZIsDerivedFromX));
- EXPECT_TRUE(
- matches("class U {}; typedef U X; typedef X V; "
- "class Z : public V {};", ZIsDerivedFromX));
- EXPECT_TRUE(
- matches("class Base {}; typedef Base X; "
- "class Z : public Base {};", ZIsDerivedFromX));
- EXPECT_TRUE(
- matches("class Base {}; typedef Base Base2; typedef Base2 X; "
- "class Z : public Base {};", ZIsDerivedFromX));
- EXPECT_TRUE(
- notMatches("class Base {}; class Base2 {}; typedef Base2 X; "
- "class Z : public Base {};", ZIsDerivedFromX));
- EXPECT_TRUE(
- matches("class A {}; typedef A X; typedef A Y; "
- "class Z : public Y {};", ZIsDerivedFromX));
- EXPECT_TRUE(
- notMatches("template <typename T> class Z;"
- "template <> class Z<void> {};"
- "template <typename T> class Z : public Z<void> {};",
- IsDerivedFromX));
- EXPECT_TRUE(
- matches("template <typename T> class X;"
- "template <> class X<void> {};"
- "template <typename T> class X : public X<void> {};",
- IsDerivedFromX));
- EXPECT_TRUE(matches(
- "class X {};"
- "template <typename T> class Z;"
- "template <> class Z<void> {};"
- "template <typename T> class Z : public Z<void>, public X {};",
- ZIsDerivedFromX));
- EXPECT_TRUE(
- notMatches("template<int> struct X;"
+ ZIsDerivedFromX));
+ EXPECT_TRUE(matches("class X {}; typedef X A; typedef A B; "
+ "class Z : public B {};",
+ ZIsDerivedFromX));
+ EXPECT_TRUE(matches("class X {}; typedef X A; typedef A B; typedef B C; "
+ "class Z : public C {};",
+ ZIsDerivedFromX));
+ EXPECT_TRUE(matches("class U {}; typedef U X; typedef X V; "
+ "class Z : public V {};",
+ ZIsDerivedFromX));
+ EXPECT_TRUE(matches("class Base {}; typedef Base X; "
+ "class Z : public Base {};",
+ ZIsDerivedFromX));
+ EXPECT_TRUE(matches("class Base {}; typedef Base Base2; typedef Base2 X; "
+ "class Z : public Base {};",
+ ZIsDerivedFromX));
+ EXPECT_TRUE(notMatches("class Base {}; class Base2 {}; typedef Base2 X; "
+ "class Z : public Base {};",
+ ZIsDerivedFromX));
+ EXPECT_TRUE(matches("class A {}; typedef A X; typedef A Y; "
+ "class Z : public Y {};",
+ ZIsDerivedFromX));
+ EXPECT_TRUE(notMatches("template <typename T> class Z;"
+ "template <> class Z<void> {};"
+ "template <typename T> class Z : public Z<void> {};",
+ IsDerivedFromX));
+ EXPECT_TRUE(matches("template <typename T> class X;"
+ "template <> class X<void> {};"
+ "template <typename T> class X : public X<void> {};",
+ IsDerivedFromX));
+ EXPECT_TRUE(
+ matches("class X {};"
+ "template <typename T> class Z;"
+ "template <> class Z<void> {};"
+ "template <typename T> class Z : public Z<void>, public X {};",
+ ZIsDerivedFromX));
+ EXPECT_TRUE(
+ notMatches("template<int> struct X;"
"template<int i> struct X : public X<i-1> {};",
- cxxRecordDecl(isDerivedFrom(recordDecl(hasName("Some"))))));
+ cxxRecordDecl(isDerivedFrom(recordDecl(hasName("Some"))))));
EXPECT_TRUE(matches(
- "struct A {};"
+ "struct A {};"
"template<int> struct X;"
"template<int i> struct X : public X<i-1> {};"
"template<> struct X<0> : public A {};"
"struct B : public X<42> {};",
- cxxRecordDecl(hasName("B"), isDerivedFrom(recordDecl(hasName("A"))))));
+ cxxRecordDecl(hasName("B"), isDerivedFrom(recordDecl(hasName("A"))))));
EXPECT_TRUE(notMatches(
"struct A {};"
"template<int> struct X;"
@@ -645,7 +603,7 @@ TEST(DeclarationMatcher, ClassIsDerived) {
// get rid of the Variable(...) matching and match the right template
// declarations directly.
const char *RecursiveTemplateOneParameter =
- "class Base1 {}; class Base2 {};"
+ "class Base1 {}; class Base2 {};"
"template <typename T> class Z;"
"template <> class Z<void> : public Base1 {};"
"template <> class Z<int> : public Base2 {};"
@@ -654,21 +612,21 @@ TEST(DeclarationMatcher, ClassIsDerived) {
"template <typename T> class Z : public Z<float>, public Z<double> {};"
"void f() { Z<float> z_float; Z<double> z_double; Z<char> z_char; }";
EXPECT_TRUE(matches(
- RecursiveTemplateOneParameter,
- varDecl(hasName("z_float"),
- hasInitializer(hasType(cxxRecordDecl(isDerivedFrom("Base1")))))));
+ RecursiveTemplateOneParameter,
+ varDecl(hasName("z_float"),
+ hasInitializer(hasType(cxxRecordDecl(isDerivedFrom("Base1")))))));
EXPECT_TRUE(notMatches(
- RecursiveTemplateOneParameter,
- varDecl(hasName("z_float"),
- hasInitializer(hasType(cxxRecordDecl(isDerivedFrom("Base2")))))));
- EXPECT_TRUE(matches(
- RecursiveTemplateOneParameter,
- varDecl(hasName("z_char"),
- hasInitializer(hasType(cxxRecordDecl(isDerivedFrom("Base1"),
- isDerivedFrom("Base2")))))));
+ RecursiveTemplateOneParameter,
+ varDecl(hasName("z_float"),
+ hasInitializer(hasType(cxxRecordDecl(isDerivedFrom("Base2")))))));
+ EXPECT_TRUE(
+ matches(RecursiveTemplateOneParameter,
+ varDecl(hasName("z_char"),
+ hasInitializer(hasType(cxxRecordDecl(
+ isDerivedFrom("Base1"), isDerivedFrom("Base2")))))));
const char *RecursiveTemplateTwoParameters =
- "class Base1 {}; class Base2 {};"
+ "class Base1 {}; class Base2 {};"
"template <typename T1, typename T2> class Z;"
"template <typename T> class Z<void, T> : public Base1 {};"
"template <typename T> class Z<int, T> : public Base2 {};"
@@ -679,34 +637,31 @@ TEST(DeclarationMatcher, ClassIsDerived) {
"void f() { Z<float, void> z_float; Z<double, void> z_double; "
" Z<char, void> z_char; }";
EXPECT_TRUE(matches(
- RecursiveTemplateTwoParameters,
- varDecl(hasName("z_float"),
- hasInitializer(hasType(cxxRecordDecl(isDerivedFrom("Base1")))))));
- EXPECT_TRUE(notMatches(
- RecursiveTemplateTwoParameters,
- varDecl(hasName("z_float"),
- hasInitializer(hasType(cxxRecordDecl(isDerivedFrom("Base2")))))));
- EXPECT_TRUE(matches(
- RecursiveTemplateTwoParameters,
- varDecl(hasName("z_char"),
- hasInitializer(hasType(cxxRecordDecl(isDerivedFrom("Base1"),
- isDerivedFrom("Base2")))))));
- EXPECT_TRUE(matches(
- "namespace ns { class X {}; class Y : public X {}; }",
- cxxRecordDecl(isDerivedFrom("::ns::X"))));
+ RecursiveTemplateTwoParameters,
+ varDecl(hasName("z_float"),
+ hasInitializer(hasType(cxxRecordDecl(isDerivedFrom("Base1")))))));
EXPECT_TRUE(notMatches(
- "class X {}; class Y : public X {};",
- cxxRecordDecl(isDerivedFrom("::ns::X"))));
+ RecursiveTemplateTwoParameters,
+ varDecl(hasName("z_float"),
+ hasInitializer(hasType(cxxRecordDecl(isDerivedFrom("Base2")))))));
+ EXPECT_TRUE(
+ matches(RecursiveTemplateTwoParameters,
+ varDecl(hasName("z_char"),
+ hasInitializer(hasType(cxxRecordDecl(
+ isDerivedFrom("Base1"), isDerivedFrom("Base2")))))));
+ EXPECT_TRUE(matches("namespace ns { class X {}; class Y : public X {}; }",
+ cxxRecordDecl(isDerivedFrom("::ns::X"))));
+ EXPECT_TRUE(notMatches("class X {}; class Y : public X {};",
+ cxxRecordDecl(isDerivedFrom("::ns::X"))));
EXPECT_TRUE(matches(
- "class X {}; class Y : public X {};",
- cxxRecordDecl(isDerivedFrom(recordDecl(hasName("X")).bind("test")))));
+ "class X {}; class Y : public X {};",
+ cxxRecordDecl(isDerivedFrom(recordDecl(hasName("X")).bind("test")))));
- EXPECT_TRUE(matches(
- "template<typename T> class X {};"
- "template<typename T> using Z = X<T>;"
- "template <typename T> class Y : Z<T> {};",
- cxxRecordDecl(isDerivedFrom(namedDecl(hasName("X"))))));
+ EXPECT_TRUE(matches("template<typename T> class X {};"
+ "template<typename T> using Z = X<T>;"
+ "template <typename T> class Y : Z<T> {};",
+ cxxRecordDecl(isDerivedFrom(namedDecl(hasName("X"))))));
}
TEST(DeclarationMatcher, IsDerivedFromEmptyName) {
@@ -737,24 +692,24 @@ TEST(DeclarationMatcher, ObjCClassIsDerived) {
DeclarationMatcher IsDirectlyDerivedFromX =
objcInterfaceDecl(isDirectlyDerivedFrom("X"));
- EXPECT_TRUE(
- matchesObjC("@interface X @end @interface Y : X @end", IsDirectlyDerivedFromX));
+ EXPECT_TRUE(matchesObjC("@interface X @end @interface Y : X @end",
+ IsDirectlyDerivedFromX));
EXPECT_TRUE(matchesObjC(
"@interface X @end @interface Y<__covariant ObjectType> : X @end",
IsDirectlyDerivedFromX));
EXPECT_TRUE(matchesObjC(
"@interface X @end @compatibility_alias Y X; @interface Z : Y @end",
IsDirectlyDerivedFromX));
- EXPECT_TRUE(matchesObjC(
- "@interface X @end typedef X Y; @interface Z : Y @end",
- IsDirectlyDerivedFromX));
+ EXPECT_TRUE(
+ matchesObjC("@interface X @end typedef X Y; @interface Z : Y @end",
+ IsDirectlyDerivedFromX));
EXPECT_TRUE(notMatchesObjC("@interface X @end", IsDirectlyDerivedFromX));
EXPECT_TRUE(notMatchesObjC("@class X;", IsDirectlyDerivedFromX));
EXPECT_TRUE(notMatchesObjC("@class Y;", IsDirectlyDerivedFromX));
EXPECT_TRUE(notMatchesObjC("@interface X @end @compatibility_alias Y X;",
IsDirectlyDerivedFromX));
- EXPECT_TRUE(notMatchesObjC("@interface X @end typedef X Y;",
- IsDirectlyDerivedFromX));
+ EXPECT_TRUE(
+ notMatchesObjC("@interface X @end typedef X Y;", IsDirectlyDerivedFromX));
DeclarationMatcher IsAX = objcInterfaceDecl(isSameOrDerivedFrom("X"));
EXPECT_TRUE(matchesObjC("@interface X @end @interface Y : X @end", IsAX));
@@ -775,9 +730,9 @@ TEST(DeclarationMatcher, ObjCClassIsDerived) {
ZIsDerivedFromX));
EXPECT_TRUE(matchesObjC(
"@interface X @end typedef X Y; @interface Z : Y @end", ZIsDerivedFromX));
- EXPECT_TRUE(matchesObjC(
- "@interface X @end typedef X Y; @interface Z : Y @end",
- ZIsDirectlyDerivedFromX));
+ EXPECT_TRUE(
+ matchesObjC("@interface X @end typedef X Y; @interface Z : Y @end",
+ ZIsDirectlyDerivedFromX));
EXPECT_TRUE(matchesObjC(
"@interface A @end typedef A X; typedef A Y; @interface Z : Y @end",
ZIsDerivedFromX));
@@ -798,27 +753,33 @@ TEST(DeclarationMatcher, ObjCClassIsDerived) {
ZIsDirectlyDerivedFromX));
EXPECT_TRUE(matchesObjC(
"@interface A @end @compatibility_alias X A; @compatibility_alias Y A;"
- "@interface Z : Y @end", ZIsDerivedFromX));
+ "@interface Z : Y @end",
+ ZIsDerivedFromX));
EXPECT_TRUE(matchesObjC(
"@interface A @end @compatibility_alias X A; @compatibility_alias Y A;"
- "@interface Z : Y @end", ZIsDirectlyDerivedFromX));
- EXPECT_TRUE(matchesObjC(
- "@interface Y @end typedef Y X; @interface Z : X @end", ZIsDerivedFromX));
- EXPECT_TRUE(matchesObjC(
- "@interface Y @end typedef Y X; @interface Z : X @end",
+ "@interface Z : Y @end",
ZIsDirectlyDerivedFromX));
EXPECT_TRUE(matchesObjC(
- "@interface A @end @compatibility_alias Y A; typedef Y X;"
- "@interface Z : A @end", ZIsDerivedFromX));
- EXPECT_TRUE(matchesObjC(
- "@interface A @end @compatibility_alias Y A; typedef Y X;"
- "@interface Z : A @end", ZIsDirectlyDerivedFromX));
- EXPECT_TRUE(matchesObjC(
- "@interface A @end typedef A Y; @compatibility_alias X Y;"
- "@interface Z : A @end", ZIsDerivedFromX));
- EXPECT_TRUE(matchesObjC(
- "@interface A @end typedef A Y; @compatibility_alias X Y;"
- "@interface Z : A @end", ZIsDirectlyDerivedFromX));
+ "@interface Y @end typedef Y X; @interface Z : X @end", ZIsDerivedFromX));
+ EXPECT_TRUE(
+ matchesObjC("@interface Y @end typedef Y X; @interface Z : X @end",
+ ZIsDirectlyDerivedFromX));
+ EXPECT_TRUE(
+ matchesObjC("@interface A @end @compatibility_alias Y A; typedef Y X;"
+ "@interface Z : A @end",
+ ZIsDerivedFromX));
+ EXPECT_TRUE(
+ matchesObjC("@interface A @end @compatibility_alias Y A; typedef Y X;"
+ "@interface Z : A @end",
+ ZIsDirectlyDerivedFromX));
+ EXPECT_TRUE(
+ matchesObjC("@interface A @end typedef A Y; @compatibility_alias X Y;"
+ "@interface Z : A @end",
+ ZIsDerivedFromX));
+ EXPECT_TRUE(
+ matchesObjC("@interface A @end typedef A Y; @compatibility_alias X Y;"
+ "@interface Z : A @end",
+ ZIsDirectlyDerivedFromX));
}
TEST(DeclarationMatcher, IsLambda) {
@@ -830,42 +791,41 @@ TEST(DeclarationMatcher, IsLambda) {
TEST(Matcher, BindMatchedNodes) {
DeclarationMatcher ClassX = has(recordDecl(hasName("::X")).bind("x"));
- EXPECT_TRUE(matchAndVerifyResultTrue("class X {};",
- ClassX, std::make_unique<VerifyIdIsBoundTo<CXXRecordDecl>>("x")));
+ EXPECT_TRUE(matchAndVerifyResultTrue(
+ "class X {};", ClassX,
+ std::make_unique<VerifyIdIsBoundTo<CXXRecordDecl>>("x")));
- EXPECT_TRUE(matchAndVerifyResultFalse("class X {};",
- ClassX, std::make_unique<VerifyIdIsBoundTo<CXXRecordDecl>>("other-id")));
+ EXPECT_TRUE(matchAndVerifyResultFalse(
+ "class X {};", ClassX,
+ std::make_unique<VerifyIdIsBoundTo<CXXRecordDecl>>("other-id")));
TypeMatcher TypeAHasClassB = hasDeclaration(
- recordDecl(hasName("A"), has(recordDecl(hasName("B")).bind("b"))));
+ recordDecl(hasName("A"), has(recordDecl(hasName("B")).bind("b"))));
- EXPECT_TRUE(matchAndVerifyResultTrue("class A { public: A *a; class B {}; };",
- TypeAHasClassB,
- std::make_unique<VerifyIdIsBoundTo<Decl>>("b")));
+ EXPECT_TRUE(matchAndVerifyResultTrue(
+ "class A { public: A *a; class B {}; };", TypeAHasClassB,
+ std::make_unique<VerifyIdIsBoundTo<Decl>>("b")));
StatementMatcher MethodX =
- callExpr(callee(cxxMethodDecl(hasName("x")))).bind("x");
+ callExpr(callee(cxxMethodDecl(hasName("x")))).bind("x");
- EXPECT_TRUE(matchAndVerifyResultTrue("class A { void x() { x(); } };",
- MethodX,
- std::make_unique<VerifyIdIsBoundTo<CXXMemberCallExpr>>("x")));
+ EXPECT_TRUE(matchAndVerifyResultTrue(
+ "class A { void x() { x(); } };", MethodX,
+ std::make_unique<VerifyIdIsBoundTo<CXXMemberCallExpr>>("x")));
}
TEST(Matcher, BindTheSameNameInAlternatives) {
StatementMatcher matcher = anyOf(
- binaryOperator(hasOperatorName("+"),
- hasLHS(expr().bind("x")),
- hasRHS(integerLiteral(equals(0)))),
- binaryOperator(hasOperatorName("+"),
- hasLHS(integerLiteral(equals(0))),
- hasRHS(expr().bind("x"))));
+ binaryOperator(hasOperatorName("+"), hasLHS(expr().bind("x")),
+ hasRHS(integerLiteral(equals(0)))),
+ binaryOperator(hasOperatorName("+"), hasLHS(integerLiteral(equals(0))),
+ hasRHS(expr().bind("x"))));
EXPECT_TRUE(matchAndVerifyResultTrue(
- // The first branch of the matcher binds x to 0 but then fails.
- // The second branch binds x to f() and succeeds.
- "int f() { return 0 + f(); }",
- matcher,
- std::make_unique<VerifyIdIsBoundTo<CallExpr>>("x")));
+ // The first branch of the matcher binds x to 0 but then fails.
+ // The second branch binds x to f() and succeeds.
+ "int f() { return 0 + f(); }", matcher,
+ std::make_unique<VerifyIdIsBoundTo<CallExpr>>("x")));
}
TEST(Matcher, BindsIDForMemoizedResults) {
@@ -873,48 +833,48 @@ TEST(Matcher, BindsIDForMemoizedResults) {
// kick in.
DeclarationMatcher ClassX = recordDecl(hasName("X")).bind("x");
EXPECT_TRUE(matchAndVerifyResultTrue(
- "class A { class B { class X {}; }; };",
- DeclarationMatcher(anyOf(
- recordDecl(hasName("A"), hasDescendant(ClassX)),
- recordDecl(hasName("B"), hasDescendant(ClassX)))),
- std::make_unique<VerifyIdIsBoundTo<Decl>>("x", 2)));
+ "class A { class B { class X {}; }; };",
+ DeclarationMatcher(
+ anyOf(recordDecl(hasName("A"), hasDescendant(ClassX)),
+ recordDecl(hasName("B"), hasDescendant(ClassX)))),
+ std::make_unique<VerifyIdIsBoundTo<Decl>>("x", 2)));
}
TEST(HasType, MatchesAsString) {
EXPECT_TRUE(
- matches("class Y { public: void x(); }; void z() {Y* y; y->x(); }",
- cxxMemberCallExpr(on(hasType(asString("class Y *"))))));
+ matches("class Y { public: void x(); }; void z() {Y* y; y->x(); }",
+ cxxMemberCallExpr(on(hasType(asString("class Y *"))))));
EXPECT_TRUE(
- matches("class X { void x(int x) {} };",
- cxxMethodDecl(hasParameter(0, hasType(asString("int"))))));
+ matches("class X { void x(int x) {} };",
+ cxxMethodDecl(hasParameter(0, hasType(asString("int"))))));
EXPECT_TRUE(matches("namespace ns { struct A {}; } struct B { ns::A a; };",
fieldDecl(hasType(asString("ns::A")))));
- EXPECT_TRUE(matches("namespace { struct A {}; } struct B { A a; };",
- fieldDecl(hasType(asString("struct (anonymous namespace)::A")))));
+ EXPECT_TRUE(
+ matches("namespace { struct A {}; } struct B { A a; };",
+ fieldDecl(hasType(asString("struct (anonymous namespace)::A")))));
}
TEST(Matcher, HasOperatorNameForOverloadedOperatorCall) {
StatementMatcher OpCallAndAnd =
- cxxOperatorCallExpr(hasOverloadedOperatorName("&&"));
+ cxxOperatorCallExpr(hasOverloadedOperatorName("&&"));
EXPECT_TRUE(matches("class Y { }; "
- "bool operator&&(Y x, Y y) { return true; }; "
- "Y a; Y b; bool c = a && b;", OpCallAndAnd));
+ "bool operator&&(Y x, Y y) { return true; }; "
+ "Y a; Y b; bool c = a && b;",
+ OpCallAndAnd));
StatementMatcher OpCallLessLess =
- cxxOperatorCallExpr(hasOverloadedOperatorName("<<"));
+ cxxOperatorCallExpr(hasOverloadedOperatorName("<<"));
EXPECT_TRUE(notMatches("class Y { }; "
- "bool operator&&(Y x, Y y) { return true; }; "
- "Y a; Y b; bool c = a && b;",
+ "bool operator&&(Y x, Y y) { return true; }; "
+ "Y a; Y b; bool c = a && b;",
OpCallLessLess));
StatementMatcher OpStarCall =
- cxxOperatorCallExpr(hasOverloadedOperatorName("*"));
- EXPECT_TRUE(matches("class Y; int operator*(Y &); void f(Y &y) { *y; }",
- OpStarCall));
+ cxxOperatorCallExpr(hasOverloadedOperatorName("*"));
+ EXPECT_TRUE(
+ matches("class Y; int operator*(Y &); void f(Y &y) { *y; }", OpStarCall));
DeclarationMatcher ClassWithOpStar =
- cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*")));
- EXPECT_TRUE(matches("class Y { int operator*(); };",
- ClassWithOpStar));
- EXPECT_TRUE(notMatches("class Y { void myOperator(); };",
- ClassWithOpStar)) ;
+ cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*")));
+ EXPECT_TRUE(matches("class Y { int operator*(); };", ClassWithOpStar));
+ EXPECT_TRUE(notMatches("class Y { void myOperator(); };", ClassWithOpStar));
DeclarationMatcher AnyOpStar = functionDecl(hasOverloadedOperatorName("*"));
EXPECT_TRUE(matches("class Y; int operator*(Y &);", AnyOpStar));
EXPECT_TRUE(matches("class Y { int operator*(); };", AnyOpStar));
@@ -926,23 +886,22 @@ TEST(Matcher, HasOperatorNameForOverloadedOperatorCall) {
EXPECT_TRUE(matches("class Y { Y operator&&(Y &); };", AnyAndOp));
}
-
TEST(Matcher, NestedOverloadedOperatorCalls) {
EXPECT_TRUE(matchAndVerifyResultTrue(
- "class Y { }; "
+ "class Y { }; "
"Y& operator&&(Y& x, Y& y) { return x; }; "
"Y a; Y b; Y c; Y d = a && b && c;",
- cxxOperatorCallExpr(hasOverloadedOperatorName("&&")).bind("x"),
- std::make_unique<VerifyIdIsBoundTo<CXXOperatorCallExpr>>("x", 2)));
+ cxxOperatorCallExpr(hasOverloadedOperatorName("&&")).bind("x"),
+ std::make_unique<VerifyIdIsBoundTo<CXXOperatorCallExpr>>("x", 2)));
EXPECT_TRUE(matches("class Y { }; "
- "Y& operator&&(Y& x, Y& y) { return x; }; "
- "Y a; Y b; Y c; Y d = a && b && c;",
+ "Y& operator&&(Y& x, Y& y) { return x; }; "
+ "Y a; Y b; Y c; Y d = a && b && c;",
cxxOperatorCallExpr(hasParent(cxxOperatorCallExpr()))));
EXPECT_TRUE(
- matches("class Y { }; "
+ matches("class Y { }; "
"Y& operator&&(Y& x, Y& y) { return x; }; "
"Y a; Y b; Y c; Y d = a && b && c;",
- cxxOperatorCallExpr(hasDescendant(cxxOperatorCallExpr()))));
+ cxxOperatorCallExpr(hasDescendant(cxxOperatorCallExpr()))));
}
TEST(Matcher, VarDecl_Storage) {
@@ -971,9 +930,9 @@ TEST(Matcher, VarDecl_StorageDuration) {
EXPECT_TRUE(matches(T, varDecl(hasName("x"), hasAutomaticStorageDuration())));
EXPECT_TRUE(
- notMatches(T, varDecl(hasName("y"), hasAutomaticStorageDuration())));
+ notMatches(T, varDecl(hasName("y"), hasAutomaticStorageDuration())));
EXPECT_TRUE(
- notMatches(T, varDecl(hasName("a"), hasAutomaticStorageDuration())));
+ notMatches(T, varDecl(hasName("a"), hasAutomaticStorageDuration())));
EXPECT_TRUE(matches(T, varDecl(hasName("y"), hasStaticStorageDuration())));
EXPECT_TRUE(matches(T, varDecl(hasName("a"), hasStaticStorageDuration())));
@@ -991,48 +950,48 @@ TEST(Matcher, VarDecl_StorageDuration) {
}
TEST(Matcher, FindsVarDeclInFunctionParameter) {
- EXPECT_TRUE(matches(
- "void f(int i) {}",
- varDecl(hasName("i"))));
+ EXPECT_TRUE(matches("void f(int i) {}", varDecl(hasName("i"))));
}
TEST(UnaryExpressionOrTypeTraitExpression, MatchesCorrectType) {
- EXPECT_TRUE(matches("void x() { int a = sizeof(a); }", sizeOfExpr(
- hasArgumentOfType(asString("int")))));
- EXPECT_TRUE(notMatches("void x() { int a = sizeof(a); }", sizeOfExpr(
- hasArgumentOfType(asString("float")))));
+ EXPECT_TRUE(matches("void x() { int a = sizeof(a); }",
+ sizeOfExpr(hasArgumentOfType(asString("int")))));
+ EXPECT_TRUE(notMatches("void x() { int a = sizeof(a); }",
+ sizeOfExpr(hasArgumentOfType(asString("float")))));
EXPECT_TRUE(matches(
- "struct A {}; void x() { A a; int b = sizeof(a); }",
- sizeOfExpr(hasArgumentOfType(hasDeclaration(recordDecl(hasName("A")))))));
- EXPECT_TRUE(notMatches("void x() { int a = sizeof(a); }", sizeOfExpr(
- hasArgumentOfType(hasDeclaration(recordDecl(hasName("string")))))));
+ "struct A {}; void x() { A a; int b = sizeof(a); }",
+ sizeOfExpr(hasArgumentOfType(hasDeclaration(recordDecl(hasName("A")))))));
+ EXPECT_TRUE(notMatches("void x() { int a = sizeof(a); }",
+ sizeOfExpr(hasArgumentOfType(
+ hasDeclaration(recordDecl(hasName("string")))))));
}
TEST(IsInteger, MatchesIntegers) {
EXPECT_TRUE(matches("int i = 0;", varDecl(hasType(isInteger()))));
- EXPECT_TRUE(matches(
- "long long i = 0; void f(long long) { }; void g() {f(i);}",
- callExpr(hasArgument(0, declRefExpr(
- to(varDecl(hasType(isInteger()))))))));
+ EXPECT_TRUE(
+ matches("long long i = 0; void f(long long) { }; void g() {f(i);}",
+ callExpr(hasArgument(
+ 0, declRefExpr(to(varDecl(hasType(isInteger()))))))));
}
TEST(IsInteger, ReportsNoFalsePositives) {
EXPECT_TRUE(notMatches("int *i;", varDecl(hasType(isInteger()))));
- EXPECT_TRUE(notMatches("struct T {}; T t; void f(T *) { }; void g() {f(&t);}",
- callExpr(hasArgument(0, declRefExpr(
- to(varDecl(hasType(isInteger()))))))));
+ EXPECT_TRUE(
+ notMatches("struct T {}; T t; void f(T *) { }; void g() {f(&t);}",
+ callExpr(hasArgument(
+ 0, declRefExpr(to(varDecl(hasType(isInteger()))))))));
}
TEST(IsSignedInteger, MatchesSignedIntegers) {
EXPECT_TRUE(matches("int i = 0;", varDecl(hasType(isSignedInteger()))));
- EXPECT_TRUE(notMatches("unsigned i = 0;",
- varDecl(hasType(isSignedInteger()))));
+ EXPECT_TRUE(
+ notMatches("unsigned i = 0;", varDecl(hasType(isSignedInteger()))));
}
TEST(IsUnsignedInteger, MatchesUnsignedIntegers) {
EXPECT_TRUE(notMatches("int i = 0;", varDecl(hasType(isUnsignedInteger()))));
- EXPECT_TRUE(matches("unsigned i = 0;",
- varDecl(hasType(isUnsignedInteger()))));
+ EXPECT_TRUE(
+ matches("unsigned i = 0;", varDecl(hasType(isUnsignedInteger()))));
}
TEST(IsAnyPointer, MatchesPointers) {
@@ -1059,8 +1018,8 @@ TEST(IsAnyCharacter, ReportsNoFalsePositives) {
TEST(IsArrow, MatchesMemberVariablesViaArrow) {
EXPECT_TRUE(matches("class Y { void x() { this->y; } int y; };",
memberExpr(isArrow())));
- EXPECT_TRUE(matches("class Y { void x() { y; } int y; };",
- memberExpr(isArrow())));
+ EXPECT_TRUE(
+ matches("class Y { void x() { y; } int y; };", memberExpr(isArrow())));
EXPECT_TRUE(notMatches("class Y { void x() { (*this).y; } int y; };",
memberExpr(isArrow())));
EXPECT_TRUE(matches("template <class T> class Y { void x() { this->m; } };",
@@ -1080,10 +1039,9 @@ TEST(IsArrow, MatchesStaticMemberVariablesViaArrow) {
}
TEST(IsArrow, MatchesMemberCallsViaArrow) {
- EXPECT_TRUE(matches("class Y { void x() { this->x(); } };",
- memberExpr(isArrow())));
- EXPECT_TRUE(matches("class Y { void x() { x(); } };",
- memberExpr(isArrow())));
+ EXPECT_TRUE(
+ matches("class Y { void x() { this->x(); } };", memberExpr(isArrow())));
+ EXPECT_TRUE(matches("class Y { void x() { x(); } };", memberExpr(isArrow())));
EXPECT_TRUE(notMatches("class Y { void x() { Y y; y.x(); } };",
memberExpr(isArrow())));
EXPECT_TRUE(
@@ -1128,20 +1086,18 @@ TEST(Matcher, ParameterCount) {
}
TEST(Matcher, References) {
- DeclarationMatcher ReferenceClassX = varDecl(
- hasType(references(recordDecl(hasName("X")))));
- EXPECT_TRUE(matches("class X {}; void y(X y) { X &x = y; }",
- ReferenceClassX));
+ DeclarationMatcher ReferenceClassX =
+ varDecl(hasType(references(recordDecl(hasName("X")))));
EXPECT_TRUE(
- matches("class X {}; void y(X y) { const X &x = y; }", ReferenceClassX));
+ matches("class X {}; void y(X y) { X &x = y; }", ReferenceClassX));
+ EXPECT_TRUE(
+ matches("class X {}; void y(X y) { const X &x = y; }", ReferenceClassX));
// The match here is on the implicit copy constructor code for
// class X, not on code 'X x = y'.
+ EXPECT_TRUE(matches("class X {}; void y(X y) { X x = y; }", ReferenceClassX));
+ EXPECT_TRUE(notMatches("class X {}; extern X x;", ReferenceClassX));
EXPECT_TRUE(
- matches("class X {}; void y(X y) { X x = y; }", ReferenceClassX));
- EXPECT_TRUE(
- notMatches("class X {}; extern X x;", ReferenceClassX));
- EXPECT_TRUE(
- notMatches("class X {}; void y(X *y) { X *&x = y; }", ReferenceClassX));
+ notMatches("class X {}; void y(X *y) { X *&x = y; }", ReferenceClassX));
}
TEST(QualType, hasLocalQualifiers) {
@@ -1149,16 +1105,15 @@ TEST(QualType, hasLocalQualifiers) {
varDecl(hasType(hasLocalQualifiers()))));
EXPECT_TRUE(matches("int *const j = nullptr;",
varDecl(hasType(hasLocalQualifiers()))));
- EXPECT_TRUE(matches("int *volatile k;",
- varDecl(hasType(hasLocalQualifiers()))));
- EXPECT_TRUE(notMatches("int m;",
- varDecl(hasType(hasLocalQualifiers()))));
+ EXPECT_TRUE(
+ matches("int *volatile k;", varDecl(hasType(hasLocalQualifiers()))));
+ EXPECT_TRUE(notMatches("int m;", varDecl(hasType(hasLocalQualifiers()))));
}
TEST(IsExternC, MatchesExternCFunctionDeclarations) {
EXPECT_TRUE(matches("extern \"C\" void f() {}", functionDecl(isExternC())));
- EXPECT_TRUE(matches("extern \"C\" { void f() {} }",
- functionDecl(isExternC())));
+ EXPECT_TRUE(
+ matches("extern \"C\" { void f() {} }", functionDecl(isExternC())));
EXPECT_TRUE(notMatches("void f() {}", functionDecl(isExternC())));
}
@@ -1186,7 +1141,7 @@ TEST(IsDefaulted, MatchesDefaultedFunctionDeclarations) {
TEST(IsDeleted, MatchesDeletedFunctionDeclarations) {
EXPECT_TRUE(
- notMatches("void Func();", functionDecl(hasName("Func"), isDeleted())));
+ notMatches("void Func();", functionDecl(hasName("Func"), isDeleted())));
EXPECT_TRUE(matches("void Func() = delete;",
functionDecl(hasName("Func"), isDeleted())));
}
@@ -1195,14 +1150,15 @@ TEST(IsNoThrow, MatchesNoThrowFunctionDeclarations) {
EXPECT_TRUE(notMatches("void f();", functionDecl(isNoThrow())));
EXPECT_TRUE(notMatches("void f() throw(int);", functionDecl(isNoThrow())));
EXPECT_TRUE(
- notMatches("void f() noexcept(false);", functionDecl(isNoThrow())));
+ notMatches("void f() noexcept(false);", functionDecl(isNoThrow())));
EXPECT_TRUE(matches("void f() throw();", functionDecl(isNoThrow())));
EXPECT_TRUE(matches("void f() noexcept;", functionDecl(isNoThrow())));
EXPECT_TRUE(notMatches("void f();", functionProtoType(isNoThrow())));
- EXPECT_TRUE(notMatches("void f() throw(int);", functionProtoType(isNoThrow())));
EXPECT_TRUE(
- notMatches("void f() noexcept(false);", functionProtoType(isNoThrow())));
+ notMatches("void f() throw(int);", functionProtoType(isNoThrow())));
+ EXPECT_TRUE(
+ notMatches("void f() noexcept(false);", functionProtoType(isNoThrow())));
EXPECT_TRUE(matches("void f() throw();", functionProtoType(isNoThrow())));
EXPECT_TRUE(matches("void f() noexcept;", functionProtoType(isNoThrow())));
}
@@ -1249,41 +1205,41 @@ TEST(hasInitStatement, MatchesRangeForInitializers) {
TEST(TemplateArgumentCountIs, Matches) {
EXPECT_TRUE(
- matches("template<typename T> struct C {}; C<int> c;",
- classTemplateSpecializationDecl(templateArgumentCountIs(1))));
+ matches("template<typename T> struct C {}; C<int> c;",
+ classTemplateSpecializationDecl(templateArgumentCountIs(1))));
EXPECT_TRUE(
- notMatches("template<typename T> struct C {}; C<int> c;",
- classTemplateSpecializationDecl(templateArgumentCountIs(2))));
+ notMatches("template<typename T> struct C {}; C<int> c;",
+ classTemplateSpecializationDecl(templateArgumentCountIs(2))));
EXPECT_TRUE(matches("template<typename T> struct C {}; C<int> c;",
templateSpecializationType(templateArgumentCountIs(1))));
EXPECT_TRUE(
- notMatches("template<typename T> struct C {}; C<int> c;",
- templateSpecializationType(templateArgumentCountIs(2))));
+ notMatches("template<typename T> struct C {}; C<int> c;",
+ templateSpecializationType(templateArgumentCountIs(2))));
}
TEST(IsIntegral, Matches) {
- EXPECT_TRUE(matches("template<int T> struct C {}; C<42> c;",
- classTemplateSpecializationDecl(
- hasAnyTemplateArgument(isIntegral()))));
+ EXPECT_TRUE(matches(
+ "template<int T> struct C {}; C<42> c;",
+ classTemplateSpecializationDecl(hasAnyTemplateArgument(isIntegral()))));
EXPECT_TRUE(notMatches("template<typename T> struct C {}; C<int> c;",
classTemplateSpecializationDecl(hasAnyTemplateArgument(
- templateArgument(isIntegral())))));
+ templateArgument(isIntegral())))));
}
TEST(EqualsIntegralValue, Matches) {
EXPECT_TRUE(matches("template<int T> struct C {}; C<42> c;",
classTemplateSpecializationDecl(
- hasAnyTemplateArgument(equalsIntegralValue("42")))));
+ hasAnyTemplateArgument(equalsIntegralValue("42")))));
EXPECT_TRUE(matches("template<int T> struct C {}; C<-42> c;",
classTemplateSpecializationDecl(
- hasAnyTemplateArgument(equalsIntegralValue("-42")))));
+ hasAnyTemplateArgument(equalsIntegralValue("-42")))));
EXPECT_TRUE(matches("template<int T> struct C {}; C<-0042> c;",
classTemplateSpecializationDecl(
- hasAnyTemplateArgument(equalsIntegralValue("-34")))));
+ hasAnyTemplateArgument(equalsIntegralValue("-34")))));
EXPECT_TRUE(notMatches("template<int T> struct C {}; C<42> c;",
classTemplateSpecializationDecl(hasAnyTemplateArgument(
- equalsIntegralValue("0042")))));
+ equalsIntegralValue("0042")))));
}
TEST(Matcher, MatchesAccessSpecDecls) {
@@ -1304,7 +1260,7 @@ TEST(Matcher, MatchesFinal) {
cxxMethodDecl(isFinal())));
EXPECT_TRUE(notMatches("class X {};", cxxRecordDecl(isFinal())));
EXPECT_TRUE(
- notMatches("class X { virtual void f(); };", cxxMethodDecl(isFinal())));
+ notMatches("class X { virtual void f(); };", cxxMethodDecl(isFinal())));
}
TEST(Matcher, MatchesVirtualMethod) {
@@ -1315,12 +1271,12 @@ TEST(Matcher, MatchesVirtualMethod) {
TEST(Matcher, MatchesVirtualAsWrittenMethod) {
EXPECT_TRUE(matches("class A { virtual int f(); };"
- "class B : public A { int f(); };",
+ "class B : public A { int f(); };",
cxxMethodDecl(isVirtualAsWritten(), hasName("::A::f"))));
EXPECT_TRUE(
- notMatches("class A { virtual int f(); };"
+ notMatches("class A { virtual int f(); };"
"class B : public A { int f(); };",
- cxxMethodDecl(isVirtualAsWritten(), hasName("::B::f"))));
+ cxxMethodDecl(isVirtualAsWritten(), hasName("::B::f"))));
}
TEST(Matcher, MatchesPureMethod) {
@@ -1358,26 +1314,26 @@ TEST(Matcher, MatchesMoveAssignmentOperator) {
TEST(Matcher, MatchesConstMethod) {
EXPECT_TRUE(
- matches("struct A { void foo() const; };", cxxMethodDecl(isConst())));
+ matches("struct A { void foo() const; };", cxxMethodDecl(isConst())));
EXPECT_TRUE(
- notMatches("struct A { void foo(); };", cxxMethodDecl(isConst())));
+ notMatches("struct A { void foo(); };", cxxMethodDecl(isConst())));
}
TEST(Matcher, MatchesOverridingMethod) {
EXPECT_TRUE(matches("class X { virtual int f(); }; "
- "class Y : public X { int f(); };",
+ "class Y : public X { int f(); };",
cxxMethodDecl(isOverride(), hasName("::Y::f"))));
EXPECT_TRUE(notMatches("class X { virtual int f(); }; "
- "class Y : public X { int f(); };",
+ "class Y : public X { int f(); };",
cxxMethodDecl(isOverride(), hasName("::X::f"))));
EXPECT_TRUE(notMatches("class X { int f(); }; "
- "class Y : public X { int f(); };",
+ "class Y : public X { int f(); };",
cxxMethodDecl(isOverride())));
EXPECT_TRUE(notMatches("class X { int f(); int f(int); }; ",
cxxMethodDecl(isOverride())));
EXPECT_TRUE(
- matches("template <typename Base> struct Y : Base { void f() override;};",
- cxxMethodDecl(isOverride(), hasName("::Y::f"))));
+ matches("template <typename Base> struct Y : Base { void f() override;};",
+ cxxMethodDecl(isOverride(), hasName("::Y::f"))));
}
TEST(Matcher, ConstructorArgument) {
@@ -1385,44 +1341,38 @@ TEST(Matcher, ConstructorArgument) {
ast_type_traits::TK_AsIs,
cxxConstructExpr(hasArgument(0, declRefExpr(to(varDecl(hasName("y")))))));
+ EXPECT_TRUE(matches(
+ "class X { public: X(int); }; void x() { int y; X x(y); }", Constructor));
EXPECT_TRUE(
- matches("class X { public: X(int); }; void x() { int y; X x(y); }",
- Constructor));
- EXPECT_TRUE(
- matches("class X { public: X(int); }; void x() { int y; X x = X(y); }",
- Constructor));
- EXPECT_TRUE(
- matches("class X { public: X(int); }; void x() { int y; X x = y; }",
- Constructor));
+ matches("class X { public: X(int); }; void x() { int y; X x = X(y); }",
+ Constructor));
EXPECT_TRUE(
- notMatches("class X { public: X(int); }; void x() { int z; X x(z); }",
- Constructor));
+ matches("class X { public: X(int); }; void x() { int y; X x = y; }",
+ Constructor));
+ EXPECT_TRUE(notMatches(
+ "class X { public: X(int); }; void x() { int z; X x(z); }", Constructor));
StatementMatcher WrongIndex =
traverse(ast_type_traits::TK_AsIs,
cxxConstructExpr(
hasArgument(42, declRefExpr(to(varDecl(hasName("y")))))));
- EXPECT_TRUE(
- notMatches("class X { public: X(int); }; void x() { int y; X x(y); }",
- WrongIndex));
+ EXPECT_TRUE(notMatches(
+ "class X { public: X(int); }; void x() { int y; X x(y); }", WrongIndex));
}
TEST(Matcher, ConstructorArgumentCount) {
auto Constructor1Arg =
traverse(ast_type_traits::TK_AsIs, cxxConstructExpr(argumentCountIs(1)));
+ EXPECT_TRUE(matches("class X { public: X(int); }; void x() { X x(0); }",
+ Constructor1Arg));
+ EXPECT_TRUE(matches("class X { public: X(int); }; void x() { X x = X(0); }",
+ Constructor1Arg));
+ EXPECT_TRUE(matches("class X { public: X(int); }; void x() { X x = 0; }",
+ Constructor1Arg));
EXPECT_TRUE(
- matches("class X { public: X(int); }; void x() { X x(0); }",
- Constructor1Arg));
- EXPECT_TRUE(
- matches("class X { public: X(int); }; void x() { X x = X(0); }",
- Constructor1Arg));
- EXPECT_TRUE(
- matches("class X { public: X(int); }; void x() { X x = 0; }",
- Constructor1Arg));
- EXPECT_TRUE(
- notMatches("class X { public: X(int, int); }; void x() { X x(0, 0); }",
- Constructor1Arg));
+ notMatches("class X { public: X(int, int); }; void x() { X x(0, 0); }",
+ Constructor1Arg));
}
TEST(Matcher, ConstructorListInitialization) {
@@ -1430,19 +1380,16 @@ TEST(Matcher, ConstructorListInitialization) {
traverse(ast_type_traits::TK_AsIs,
varDecl(has(cxxConstructExpr(isListInitialization()))));
- EXPECT_TRUE(
- matches("class X { public: X(int); }; void x() { X x{0}; }",
- ConstructorListInit));
- EXPECT_FALSE(
- matches("class X { public: X(int); }; void x() { X x(0); }",
- ConstructorListInit));
+ EXPECT_TRUE(matches("class X { public: X(int); }; void x() { X x{0}; }",
+ ConstructorListInit));
+ EXPECT_FALSE(matches("class X { public: X(int); }; void x() { X x(0); }",
+ ConstructorListInit));
}
TEST(ConstructorDeclaration, IsImplicit) {
// This one doesn't match because the constructor is not added by the
// compiler (it is not needed).
- EXPECT_TRUE(notMatches("class Foo { };",
- cxxConstructorDecl(isImplicit())));
+ EXPECT_TRUE(notMatches("class Foo { };", cxxConstructorDecl(isImplicit())));
// The compiler added the implicit default constructor.
EXPECT_TRUE(matches("class Foo { }; Foo* f = new Foo();",
cxxConstructorDecl(isImplicit())));
@@ -1456,8 +1403,8 @@ TEST(ConstructorDeclaration, IsImplicit) {
TEST(ConstructorDeclaration, IsExplicit) {
EXPECT_TRUE(matches("struct S { explicit S(int); };",
cxxConstructorDecl(isExplicit())));
- EXPECT_TRUE(notMatches("struct S { S(int); };",
- cxxConstructorDecl(isExplicit())));
+ EXPECT_TRUE(
+ notMatches("struct S { S(int); };", cxxConstructorDecl(isExplicit())));
EXPECT_TRUE(notMatches("template<bool b> struct S { explicit(b) S(int);};",
cxxConstructorDecl(isExplicit()), langCxx20OrLater()));
EXPECT_TRUE(matches("struct S { explicit(true) S(int);};",
@@ -1488,9 +1435,9 @@ TEST(DeductionGuideDeclaration, IsExplicit) {
}
TEST(ConstructorDeclaration, Kinds) {
- EXPECT_TRUE(matches(
- "struct S { S(); };",
- cxxConstructorDecl(isDefaultConstructor(), unless(isImplicit()))));
+ EXPECT_TRUE(
+ matches("struct S { S(); };", cxxConstructorDecl(isDefaultConstructor(),
+ unless(isImplicit()))));
EXPECT_TRUE(notMatches(
"struct S { S(); };",
cxxConstructorDecl(isCopyConstructor(), unless(isImplicit()))));
@@ -1501,9 +1448,9 @@ TEST(ConstructorDeclaration, Kinds) {
EXPECT_TRUE(notMatches(
"struct S { S(const S&); };",
cxxConstructorDecl(isDefaultConstructor(), unless(isImplicit()))));
- EXPECT_TRUE(matches(
- "struct S { S(const S&); };",
- cxxConstructorDecl(isCopyConstructor(), unless(isImplicit()))));
+ EXPECT_TRUE(
+ matches("struct S { S(const S&); };",
+ cxxConstructorDecl(isCopyConstructor(), unless(isImplicit()))));
EXPECT_TRUE(notMatches(
"struct S { S(const S&); };",
cxxConstructorDecl(isMoveConstructor(), unless(isImplicit()))));
@@ -1514,9 +1461,9 @@ TEST(ConstructorDeclaration, Kinds) {
EXPECT_TRUE(notMatches(
"struct S { S(S&&); };",
cxxConstructorDecl(isCopyConstructor(), unless(isImplicit()))));
- EXPECT_TRUE(matches(
- "struct S { S(S&&); };",
- cxxConstructorDecl(isMoveConstructor(), unless(isImplicit()))));
+ EXPECT_TRUE(
+ matches("struct S { S(S&&); };",
+ cxxConstructorDecl(isMoveConstructor(), unless(isImplicit()))));
}
TEST(ConstructorDeclaration, IsUserProvided) {
@@ -1527,7 +1474,7 @@ TEST(ConstructorDeclaration, IsUserProvided) {
EXPECT_TRUE(notMatches("struct S { S() = delete; };",
cxxConstructorDecl(isUserProvided())));
EXPECT_TRUE(
- matches("struct S { S(); };", cxxConstructorDecl(isUserProvided())));
+ matches("struct S { S(); };", cxxConstructorDecl(isUserProvided())));
EXPECT_TRUE(matches("struct S { S(); }; S::S(){}",
cxxConstructorDecl(isUserProvided())));
}
@@ -1538,11 +1485,11 @@ TEST(ConstructorDeclaration, IsDelegatingConstructor) {
EXPECT_TRUE(notMatches("struct S { S(){} S(int X) : X(X) {} int X; };",
cxxConstructorDecl(isDelegatingConstructor())));
EXPECT_TRUE(matches(
- "struct S { S() : S(0) {} S(int X) : X(X) {} int X; };",
- cxxConstructorDecl(isDelegatingConstructor(), parameterCountIs(0))));
+ "struct S { S() : S(0) {} S(int X) : X(X) {} int X; };",
+ cxxConstructorDecl(isDelegatingConstructor(), parameterCountIs(0))));
EXPECT_TRUE(matches(
- "struct S { S(); S(int X); int X; }; S::S(int X) : S() {}",
- cxxConstructorDecl(isDelegatingConstructor(), parameterCountIs(1))));
+ "struct S { S(); S(int X); int X; }; S::S(int X) : S() {}",
+ cxxConstructorDecl(isDelegatingConstructor(), parameterCountIs(1))));
}
TEST(StringLiteral, HasSize) {
@@ -1584,38 +1531,28 @@ TEST(Matcher, HasNameSupportsNamespaces) {
}
TEST(Matcher, HasNameSupportsOuterClasses) {
- EXPECT_TRUE(
- matches("class A { class B { class C; }; };",
- recordDecl(hasName("A::B::C"))));
- EXPECT_TRUE(
- matches("class A { class B { class C; }; };",
- recordDecl(hasName("::A::B::C"))));
- EXPECT_TRUE(
- matches("class A { class B { class C; }; };",
- recordDecl(hasName("B::C"))));
- EXPECT_TRUE(
- matches("class A { class B { class C; }; };",
- recordDecl(hasName("C"))));
- EXPECT_TRUE(
- notMatches("class A { class B { class C; }; };",
- recordDecl(hasName("c::B::C"))));
- EXPECT_TRUE(
- notMatches("class A { class B { class C; }; };",
- recordDecl(hasName("A::c::C"))));
- EXPECT_TRUE(
- notMatches("class A { class B { class C; }; };",
- recordDecl(hasName("A::B::A"))));
- EXPECT_TRUE(
- notMatches("class A { class B { class C; }; };",
- recordDecl(hasName("::C"))));
- EXPECT_TRUE(
- notMatches("class A { class B { class C; }; };",
- recordDecl(hasName("::B::C"))));
+ EXPECT_TRUE(matches("class A { class B { class C; }; };",
+ recordDecl(hasName("A::B::C"))));
+ EXPECT_TRUE(matches("class A { class B { class C; }; };",
+ recordDecl(hasName("::A::B::C"))));
+ EXPECT_TRUE(matches("class A { class B { class C; }; };",
+ recordDecl(hasName("B::C"))));
+ EXPECT_TRUE(
+ matches("class A { class B { class C; }; };", recordDecl(hasName("C"))));
+ EXPECT_TRUE(notMatches("class A { class B { class C; }; };",
+ recordDecl(hasName("c::B::C"))));
+ EXPECT_TRUE(notMatches("class A { class B { class C; }; };",
+ recordDecl(hasName("A::c::C"))));
+ EXPECT_TRUE(notMatches("class A { class B { class C; }; };",
+ recordDecl(hasName("A::B::A"))));
+ EXPECT_TRUE(notMatches("class A { class B { class C; }; };",
+ recordDecl(hasName("::C"))));
+ EXPECT_TRUE(notMatches("class A { class B { class C; }; };",
+ recordDecl(hasName("::B::C"))));
EXPECT_TRUE(notMatches("class A { class B { class C; }; };",
recordDecl(hasName("z::A::B::C"))));
- EXPECT_TRUE(
- notMatches("class A { class B { class C; }; };",
- recordDecl(hasName("A+B::C"))));
+ EXPECT_TRUE(notMatches("class A { class B { class C; }; };",
+ recordDecl(hasName("A+B::C"))));
}
TEST(Matcher, HasNameSupportsInlinedNamespaces) {
@@ -1629,10 +1566,10 @@ TEST(Matcher, HasNameSupportsInlinedNamespaces) {
TEST(Matcher, HasNameSupportsAnonymousNamespaces) {
StringRef code = "namespace a { namespace { class C; } }";
EXPECT_TRUE(
- matches(code, recordDecl(hasName("a::(anonymous namespace)::C"))));
+ matches(code, recordDecl(hasName("a::(anonymous namespace)::C"))));
EXPECT_TRUE(matches(code, recordDecl(hasName("a::C"))));
EXPECT_TRUE(
- matches(code, recordDecl(hasName("::a::(anonymous namespace)::C"))));
+ matches(code, recordDecl(hasName("::a::(anonymous namespace)::C"))));
EXPECT_TRUE(matches(code, recordDecl(hasName("::a::C"))));
}
@@ -1689,7 +1626,7 @@ TEST(Matcher, HasAnyName) {
EXPECT_TRUE(notMatches(Code, recordDecl(hasAnyName("::C", "::b::C"))));
EXPECT_TRUE(
- matches(Code, recordDecl(hasAnyName("::C", "::b::C", "::a::b::C"))));
+ matches(Code, recordDecl(hasAnyName("::C", "::b::C", "::a::b::C"))));
std::vector<StringRef> Names = {"::C", "::b::C", "::a::b::C"};
EXPECT_TRUE(matches(Code, recordDecl(hasAnyName(Names))));
@@ -1697,27 +1634,27 @@ TEST(Matcher, HasAnyName) {
TEST(Matcher, IsDefinition) {
DeclarationMatcher DefinitionOfClassA =
- recordDecl(hasName("A"), isDefinition());
+ recordDecl(hasName("A"), isDefinition());
EXPECT_TRUE(matches("class A {};", DefinitionOfClassA));
EXPECT_TRUE(notMatches("class A;", DefinitionOfClassA));
DeclarationMatcher DefinitionOfVariableA =
- varDecl(hasName("a"), isDefinition());
+ varDecl(hasName("a"), isDefinition());
EXPECT_TRUE(matches("int a;", DefinitionOfVariableA));
EXPECT_TRUE(notMatches("extern int a;", DefinitionOfVariableA));
DeclarationMatcher DefinitionOfMethodA =
- cxxMethodDecl(hasName("a"), isDefinition());
+ cxxMethodDecl(hasName("a"), isDefinition());
EXPECT_TRUE(matches("class A { void a() {} };", DefinitionOfMethodA));
EXPECT_TRUE(notMatches("class A { void a(); };", DefinitionOfMethodA));
DeclarationMatcher DefinitionOfObjCMethodA =
- objcMethodDecl(hasName("a"), isDefinition());
+ objcMethodDecl(hasName("a"), isDefinition());
EXPECT_TRUE(matchesObjC("@interface A @end "
"@implementation A; -(void)a {} @end",
DefinitionOfObjCMethodA));
- EXPECT_TRUE(notMatchesObjC("@interface A; - (void)a; @end",
- DefinitionOfObjCMethodA));
+ EXPECT_TRUE(
+ notMatchesObjC("@interface A; - (void)a; @end", DefinitionOfObjCMethodA));
}
TEST(Matcher, HandlesNullQualTypes) {
@@ -1728,7 +1665,7 @@ TEST(Matcher, HandlesNullQualTypes) {
// We don't really care whether this matcher succeeds; we're testing that
// it completes without crashing.
EXPECT_TRUE(matches(
- "struct A { };"
+ "struct A { };"
"template <typename T>"
"void f(T t) {"
" T local_t(t /* this becomes a null QualType in the AST */);"
@@ -1736,13 +1673,10 @@ TEST(Matcher, HandlesNullQualTypes) {
"void g() {"
" f(0);"
"}",
- expr(hasType(TypeMatcher(
- anyOf(
- TypeMatcher(hasDeclaration(anything())),
- pointsTo(AnyType),
- references(AnyType)
- // Other QualType matchers should go here.
- ))))));
+ expr(hasType(TypeMatcher(anyOf(TypeMatcher(hasDeclaration(anything())),
+ pointsTo(AnyType), references(AnyType)
+ // Other QualType matchers should go here.
+ ))))));
}
TEST(ObjCIvarRefExprMatcher, IvarExpr) {
@@ -1750,10 +1684,10 @@ TEST(ObjCIvarRefExprMatcher, IvarExpr) {
"@interface A @end "
"@implementation A { A *x; } - (void) func { x = 0; } @end";
EXPECT_TRUE(matchesObjC(ObjCString, objcIvarRefExpr()));
- EXPECT_TRUE(matchesObjC(ObjCString, objcIvarRefExpr(
- hasDeclaration(namedDecl(hasName("x"))))));
- EXPECT_FALSE(matchesObjC(ObjCString, objcIvarRefExpr(
- hasDeclaration(namedDecl(hasName("y"))))));
+ EXPECT_TRUE(matchesObjC(
+ ObjCString, objcIvarRefExpr(hasDeclaration(namedDecl(hasName("x"))))));
+ EXPECT_FALSE(matchesObjC(
+ ObjCString, objcIvarRefExpr(hasDeclaration(namedDecl(hasName("y"))))));
}
TEST(BlockExprMatcher, BlockExpr) {
@@ -1761,24 +1695,19 @@ TEST(BlockExprMatcher, BlockExpr) {
}
TEST(StatementCountIs, FindsNoStatementsInAnEmptyCompoundStatement) {
- EXPECT_TRUE(matches("void f() { }",
- compoundStmt(statementCountIs(0))));
- EXPECT_TRUE(notMatches("void f() {}",
- compoundStmt(statementCountIs(1))));
+ EXPECT_TRUE(matches("void f() { }", compoundStmt(statementCountIs(0))));
+ EXPECT_TRUE(notMatches("void f() {}", compoundStmt(statementCountIs(1))));
}
TEST(StatementCountIs, AppearsToMatchOnlyOneCount) {
- EXPECT_TRUE(matches("void f() { 1; }",
- compoundStmt(statementCountIs(1))));
- EXPECT_TRUE(notMatches("void f() { 1; }",
- compoundStmt(statementCountIs(0))));
- EXPECT_TRUE(notMatches("void f() { 1; }",
- compoundStmt(statementCountIs(2))));
+ EXPECT_TRUE(matches("void f() { 1; }", compoundStmt(statementCountIs(1))));
+ EXPECT_TRUE(notMatches("void f() { 1; }", compoundStmt(statementCountIs(0))));
+ EXPECT_TRUE(notMatches("void f() { 1; }", compoundStmt(statementCountIs(2))));
}
TEST(StatementCountIs, WorksWithMultipleStatements) {
- EXPECT_TRUE(matches("void f() { 1; 2; 3; }",
- compoundStmt(statementCountIs(3))));
+ EXPECT_TRUE(
+ matches("void f() { 1; 2; 3; }", compoundStmt(statementCountIs(3))));
}
TEST(StatementCountIs, WorksWithNestedCompoundStatements) {
@@ -1806,19 +1735,19 @@ TEST(Member, DoesNotMatchTheBaseExpression) {
TEST(Member, MatchesInMemberFunctionCall) {
EXPECT_TRUE(matches("void f() {"
- " struct { void first() {}; } s;"
- " s.first();"
- "};",
+ " struct { void first() {}; } s;"
+ " s.first();"
+ "};",
memberExpr(member(hasName("first")))));
}
TEST(Member, MatchesMember) {
- EXPECT_TRUE(matches(
- "struct A { int i; }; void f() { A a; a.i = 2; }",
- memberExpr(hasDeclaration(fieldDecl(hasType(isInteger()))))));
- EXPECT_TRUE(notMatches(
- "struct A { float f; }; void f() { A a; a.f = 2.0f; }",
- memberExpr(hasDeclaration(fieldDecl(hasType(isInteger()))))));
+ EXPECT_TRUE(
+ matches("struct A { int i; }; void f() { A a; a.i = 2; }",
+ memberExpr(hasDeclaration(fieldDecl(hasType(isInteger()))))));
+ EXPECT_TRUE(
+ notMatches("struct A { float f; }; void f() { A a; a.f = 2.0f; }",
+ memberExpr(hasDeclaration(fieldDecl(hasType(isInteger()))))));
}
TEST(Member, BitFields) {
@@ -1841,26 +1770,26 @@ TEST(Member, InClassInitializer) {
}
TEST(Member, UnderstandsAccess) {
- EXPECT_TRUE(matches(
- "struct A { int i; };", fieldDecl(isPublic(), hasName("i"))));
- EXPECT_TRUE(notMatches(
- "struct A { int i; };", fieldDecl(isProtected(), hasName("i"))));
- EXPECT_TRUE(notMatches(
- "struct A { int i; };", fieldDecl(isPrivate(), hasName("i"))));
+ EXPECT_TRUE(
+ matches("struct A { int i; };", fieldDecl(isPublic(), hasName("i"))));
+ EXPECT_TRUE(notMatches("struct A { int i; };",
+ fieldDecl(isProtected(), hasName("i"))));
+ EXPECT_TRUE(
+ notMatches("struct A { int i; };", fieldDecl(isPrivate(), hasName("i"))));
- EXPECT_TRUE(notMatches(
- "class A { int i; };", fieldDecl(isPublic(), hasName("i"))));
- EXPECT_TRUE(notMatches(
- "class A { int i; };", fieldDecl(isProtected(), hasName("i"))));
- EXPECT_TRUE(matches(
- "class A { int i; };", fieldDecl(isPrivate(), hasName("i"))));
+ EXPECT_TRUE(
+ notMatches("class A { int i; };", fieldDecl(isPublic(), hasName("i"))));
+ EXPECT_TRUE(notMatches("class A { int i; };",
+ fieldDecl(isProtected(), hasName("i"))));
+ EXPECT_TRUE(
+ matches("class A { int i; };", fieldDecl(isPrivate(), hasName("i"))));
- EXPECT_TRUE(notMatches(
- "class A { protected: int i; };", fieldDecl(isPublic(), hasName("i"))));
+ EXPECT_TRUE(notMatches("class A { protected: int i; };",
+ fieldDecl(isPublic(), hasName("i"))));
EXPECT_TRUE(matches("class A { protected: int i; };",
fieldDecl(isProtected(), hasName("i"))));
- EXPECT_TRUE(notMatches(
- "class A { protected: int i; };", fieldDecl(isPrivate(), hasName("i"))));
+ EXPECT_TRUE(notMatches("class A { protected: int i; };",
+ fieldDecl(isPrivate(), hasName("i"))));
// Non-member decls have the AccessSpecifier AS_none and thus aren't matched.
EXPECT_TRUE(notMatches("int i;", varDecl(isPublic(), hasName("i"))));
@@ -1883,35 +1812,35 @@ TEST(hasDynamicExceptionSpec, MatchesDynamicExceptionSpecifications) {
EXPECT_TRUE(
matches("void l() throw(...);", functionDecl(hasDynamicExceptionSpec())));
- EXPECT_TRUE(notMatches("void f();", functionProtoType(hasDynamicExceptionSpec())));
+ EXPECT_TRUE(
+ notMatches("void f();", functionProtoType(hasDynamicExceptionSpec())));
EXPECT_TRUE(notMatches("void g() noexcept;",
functionProtoType(hasDynamicExceptionSpec())));
EXPECT_TRUE(notMatches("void h() noexcept(true);",
functionProtoType(hasDynamicExceptionSpec())));
EXPECT_TRUE(notMatches("void i() noexcept(false);",
functionProtoType(hasDynamicExceptionSpec())));
- EXPECT_TRUE(
- matches("void j() throw();", functionProtoType(hasDynamicExceptionSpec())));
- EXPECT_TRUE(
- matches("void k() throw(int);", functionProtoType(hasDynamicExceptionSpec())));
- EXPECT_TRUE(
- matches("void l() throw(...);", functionProtoType(hasDynamicExceptionSpec())));
+ EXPECT_TRUE(matches("void j() throw();",
+ functionProtoType(hasDynamicExceptionSpec())));
+ EXPECT_TRUE(matches("void k() throw(int);",
+ functionProtoType(hasDynamicExceptionSpec())));
+ EXPECT_TRUE(matches("void l() throw(...);",
+ functionProtoType(hasDynamicExceptionSpec())));
}
TEST(HasObjectExpression, DoesNotMatchMember) {
EXPECT_TRUE(notMatches(
- "class X {}; struct Z { X m; }; void f(Z z) { z.m; }",
- memberExpr(hasObjectExpression(hasType(recordDecl(hasName("X")))))));
+ "class X {}; struct Z { X m; }; void f(Z z) { z.m; }",
+ memberExpr(hasObjectExpression(hasType(recordDecl(hasName("X")))))));
}
TEST(HasObjectExpression, MatchesBaseOfVariable) {
EXPECT_TRUE(matches(
- "struct X { int m; }; void f(X x) { x.m; }",
- memberExpr(hasObjectExpression(hasType(recordDecl(hasName("X")))))));
- EXPECT_TRUE(matches(
- "struct X { int m; }; void f(X* x) { x->m; }",
- memberExpr(hasObjectExpression(
- hasType(pointsTo(recordDecl(hasName("X"))))))));
+ "struct X { int m; }; void f(X x) { x.m; }",
+ memberExpr(hasObjectExpression(hasType(recordDecl(hasName("X")))))));
+ EXPECT_TRUE(matches("struct X { int m; }; void f(X* x) { x->m; }",
+ memberExpr(hasObjectExpression(
+ hasType(pointsTo(recordDecl(hasName("X"))))))));
EXPECT_TRUE(matches("template <class T> struct X { void f() { T t; t.m; } };",
cxxDependentScopeMemberExpr(hasObjectExpression(
declRefExpr(to(namedDecl(hasName("t"))))))));
@@ -1936,14 +1865,12 @@ TEST(HasObjectExpression, MatchesBaseOfMemberFunc) {
TEST(HasObjectExpression,
MatchesObjectExpressionOfImplicitlyFormedMemberExpression) {
- EXPECT_TRUE(matches(
- "class X {}; struct S { X m; void f() { this->m; } };",
- memberExpr(hasObjectExpression(
- hasType(pointsTo(recordDecl(hasName("S"))))))));
- EXPECT_TRUE(matches(
- "class X {}; struct S { X m; void f() { m; } };",
- memberExpr(hasObjectExpression(
- hasType(pointsTo(recordDecl(hasName("S"))))))));
+ EXPECT_TRUE(matches("class X {}; struct S { X m; void f() { this->m; } };",
+ memberExpr(hasObjectExpression(
+ hasType(pointsTo(recordDecl(hasName("S"))))))));
+ EXPECT_TRUE(matches("class X {}; struct S { X m; void f() { m; } };",
+ memberExpr(hasObjectExpression(
+ hasType(pointsTo(recordDecl(hasName("S"))))))));
}
TEST(Field, DoesNotMatchNonFieldMembers) {
@@ -1958,17 +1885,17 @@ TEST(Field, MatchesField) {
}
TEST(IsVolatileQualified, QualifiersMatch) {
- EXPECT_TRUE(matches("volatile int i = 42;",
- varDecl(hasType(isVolatileQualified()))));
- EXPECT_TRUE(notMatches("volatile int *i;",
- varDecl(hasType(isVolatileQualified()))));
+ EXPECT_TRUE(
+ matches("volatile int i = 42;", varDecl(hasType(isVolatileQualified()))));
+ EXPECT_TRUE(
+ notMatches("volatile int *i;", varDecl(hasType(isVolatileQualified()))));
EXPECT_TRUE(matches("typedef volatile int v_int; v_int i = 42;",
varDecl(hasType(isVolatileQualified()))));
}
TEST(IsConstQualified, MatchesConstInt) {
- EXPECT_TRUE(matches("const int i = 42;",
- varDecl(hasType(isConstQualified()))));
+ EXPECT_TRUE(
+ matches("const int i = 42;", varDecl(hasType(isConstQualified()))));
}
TEST(IsConstQualified, MatchesConstPointer) {
@@ -1986,43 +1913,41 @@ TEST(IsConstQualified, MatchesThroughTypedef) {
TEST(IsConstQualified, DoesNotMatchInappropriately) {
EXPECT_TRUE(notMatches("typedef int nonconst_int; nonconst_int i = 42;",
varDecl(hasType(isConstQualified()))));
- EXPECT_TRUE(notMatches("int const* p;",
- varDecl(hasType(isConstQualified()))));
+ EXPECT_TRUE(
+ notMatches("int const* p;", varDecl(hasType(isConstQualified()))));
}
TEST(DeclCount, DeclCountIsCorrect) {
- EXPECT_TRUE(matches("void f() {int i,j;}",
- declStmt(declCountIs(2))));
- EXPECT_TRUE(notMatches("void f() {int i,j; int k;}",
- declStmt(declCountIs(3))));
- EXPECT_TRUE(notMatches("void f() {int i,j, k, l;}",
- declStmt(declCountIs(3))));
+ EXPECT_TRUE(matches("void f() {int i,j;}", declStmt(declCountIs(2))));
+ EXPECT_TRUE(
+ notMatches("void f() {int i,j; int k;}", declStmt(declCountIs(3))));
+ EXPECT_TRUE(
+ notMatches("void f() {int i,j, k, l;}", declStmt(declCountIs(3))));
}
-
TEST(EachOf, TriggersForEachMatch) {
EXPECT_TRUE(matchAndVerifyResultTrue(
- "class A { int a; int b; };",
- recordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")),
- has(fieldDecl(hasName("b")).bind("v")))),
- std::make_unique<VerifyIdIsBoundTo<FieldDecl>>("v", 2)));
+ "class A { int a; int b; };",
+ recordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")),
+ has(fieldDecl(hasName("b")).bind("v")))),
+ std::make_unique<VerifyIdIsBoundTo<FieldDecl>>("v", 2)));
}
TEST(EachOf, BehavesLikeAnyOfUnlessBothMatch) {
EXPECT_TRUE(matchAndVerifyResultTrue(
- "class A { int a; int c; };",
- recordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")),
- has(fieldDecl(hasName("b")).bind("v")))),
- std::make_unique<VerifyIdIsBoundTo<FieldDecl>>("v", 1)));
+ "class A { int a; int c; };",
+ recordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")),
+ has(fieldDecl(hasName("b")).bind("v")))),
+ std::make_unique<VerifyIdIsBoundTo<FieldDecl>>("v", 1)));
EXPECT_TRUE(matchAndVerifyResultTrue(
- "class A { int c; int b; };",
- recordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")),
- has(fieldDecl(hasName("b")).bind("v")))),
- std::make_unique<VerifyIdIsBoundTo<FieldDecl>>("v", 1)));
- EXPECT_TRUE(notMatches(
- "class A { int c; int d; };",
- recordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")),
- has(fieldDecl(hasName("b")).bind("v"))))));
+ "class A { int c; int b; };",
+ recordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")),
+ has(fieldDecl(hasName("b")).bind("v")))),
+ std::make_unique<VerifyIdIsBoundTo<FieldDecl>>("v", 1)));
+ EXPECT_TRUE(
+ notMatches("class A { int c; int d; };",
+ recordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")),
+ has(fieldDecl(hasName("b")).bind("v"))))));
}
TEST(Optionally, SubmatchersDoNotMatch) {
@@ -2056,29 +1981,30 @@ TEST(IsTemplateInstantiation, MatchesImplicitClassTemplateInstantiation) {
// Make sure that we can both match the class by name (::X) and by the type
// the template was instantiated with (via a field).
- EXPECT_TRUE(matches(
- "template <typename T> class X {}; class A {}; X<A> x;",
- cxxRecordDecl(hasName("::X"), isTemplateInstantiation())));
+ EXPECT_TRUE(
+ matches("template <typename T> class X {}; class A {}; X<A> x;",
+ cxxRecordDecl(hasName("::X"), isTemplateInstantiation())));
EXPECT_TRUE(matches(
- "template <typename T> class X { T t; }; class A {}; X<A> x;",
- cxxRecordDecl(isTemplateInstantiation(), hasDescendant(
- fieldDecl(hasType(recordDecl(hasName("A"))))))));
+ "template <typename T> class X { T t; }; class A {}; X<A> x;",
+ cxxRecordDecl(
+ isTemplateInstantiation(),
+ hasDescendant(fieldDecl(hasType(recordDecl(hasName("A"))))))));
}
TEST(IsTemplateInstantiation, MatchesImplicitFunctionTemplateInstantiation) {
EXPECT_TRUE(matches(
- "template <typename T> void f(T t) {} class A {}; void g() { f(A()); }",
- functionDecl(hasParameter(0, hasType(recordDecl(hasName("A")))),
- isTemplateInstantiation())));
+ "template <typename T> void f(T t) {} class A {}; void g() { f(A()); }",
+ functionDecl(hasParameter(0, hasType(recordDecl(hasName("A")))),
+ isTemplateInstantiation())));
}
TEST(IsTemplateInstantiation, MatchesExplicitClassTemplateInstantiation) {
- EXPECT_TRUE(matches(
- "template <typename T> class X { T t; }; class A {};"
- "template class X<A>;",
- cxxRecordDecl(isTemplateInstantiation(), hasDescendant(
- fieldDecl(hasType(recordDecl(hasName("A"))))))));
+ EXPECT_TRUE(matches("template <typename T> class X { T t; }; class A {};"
+ "template class X<A>;",
+ cxxRecordDecl(isTemplateInstantiation(),
+ hasDescendant(fieldDecl(
+ hasType(recordDecl(hasName("A"))))))));
// Make sure that we match the instantiation instead of the template
// definition by checking whether the member function is present.
@@ -2091,21 +2017,21 @@ TEST(IsTemplateInstantiation, MatchesExplicitClassTemplateInstantiation) {
TEST(IsTemplateInstantiation,
MatchesInstantiationOfPartiallySpecializedClassTemplate) {
- EXPECT_TRUE(matches(
- "template <typename T> class X {};"
- "template <typename T> class X<T*> {}; class A {}; X<A*> x;",
- cxxRecordDecl(hasName("::X"), isTemplateInstantiation())));
+ EXPECT_TRUE(
+ matches("template <typename T> class X {};"
+ "template <typename T> class X<T*> {}; class A {}; X<A*> x;",
+ cxxRecordDecl(hasName("::X"), isTemplateInstantiation())));
}
TEST(IsTemplateInstantiation,
MatchesInstantiationOfClassTemplateNestedInNonTemplate) {
- EXPECT_TRUE(matches(
- "class A {};"
- "class X {"
- " template <typename U> class Y { U u; };"
- " Y<A> y;"
- "};",
- cxxRecordDecl(hasName("::X::Y"), isTemplateInstantiation())));
+ EXPECT_TRUE(
+ matches("class A {};"
+ "class X {"
+ " template <typename U> class Y { U u; };"
+ " Y<A> y;"
+ "};",
+ cxxRecordDecl(hasName("::X::Y"), isTemplateInstantiation())));
}
TEST(IsTemplateInstantiation, DoesNotMatchInstantiationsInsideOfInstantiation) {
@@ -2113,31 +2039,30 @@ TEST(IsTemplateInstantiation, DoesNotMatchInstantiationsInsideOfInstantiation) {
// normal use case as long as the uppermost instantiation always is marked
// as template instantiation, but it might be confusing as a predicate.
EXPECT_TRUE(matches(
- "class A {};"
+ "class A {};"
"template <typename T> class X {"
" template <typename U> class Y { U u; };"
" Y<T> y;"
"}; X<A> x;",
- cxxRecordDecl(hasName("::X<A>::Y"), unless(isTemplateInstantiation()))));
+ cxxRecordDecl(hasName("::X<A>::Y"), unless(isTemplateInstantiation()))));
}
TEST(IsTemplateInstantiation, DoesNotMatchExplicitClassTemplateSpecialization) {
- EXPECT_TRUE(notMatches(
- "template <typename T> class X {}; class A {};"
- "template <> class X<A> {}; X<A> x;",
- cxxRecordDecl(hasName("::X"), isTemplateInstantiation())));
+ EXPECT_TRUE(
+ notMatches("template <typename T> class X {}; class A {};"
+ "template <> class X<A> {}; X<A> x;",
+ cxxRecordDecl(hasName("::X"), isTemplateInstantiation())));
}
TEST(IsTemplateInstantiation, DoesNotMatchNonTemplate) {
- EXPECT_TRUE(notMatches(
- "class A {}; class Y { A a; };",
- cxxRecordDecl(isTemplateInstantiation())));
+ EXPECT_TRUE(notMatches("class A {}; class Y { A a; };",
+ cxxRecordDecl(isTemplateInstantiation())));
}
TEST(IsInstantiated, MatchesInstantiation) {
EXPECT_TRUE(
- matches("template<typename T> class A { T i; }; class Y { A<int> a; };",
- cxxRecordDecl(isInstantiated())));
+ matches("template<typename T> class A { T i; }; class Y { A<int> a; };",
+ cxxRecordDecl(isInstantiated())));
}
TEST(IsInstantiated, NotMatchesDefinition) {
@@ -2147,7 +2072,7 @@ TEST(IsInstantiated, NotMatchesDefinition) {
TEST(IsInTemplateInstantiation, MatchesInstantiationStmt) {
EXPECT_TRUE(matches("template<typename T> struct A { A() { T i; } };"
- "class Y { A<int> a; }; Y y;",
+ "class Y { A<int> a; }; Y y;",
declStmt(isInTemplateInstantiation())));
}
@@ -2158,8 +2083,8 @@ TEST(IsInTemplateInstantiation, NotMatchesDefinitionStmt) {
TEST(IsInstantiated, MatchesFunctionInstantiation) {
EXPECT_TRUE(
- matches("template<typename T> void A(T t) { T i; } void x() { A(0); }",
- functionDecl(isInstantiated())));
+ matches("template<typename T> void A(T t) { T i; } void x() { A(0); }",
+ functionDecl(isInstantiated())));
}
TEST(IsInstantiated, NotMatchesFunctionDefinition) {
@@ -2169,8 +2094,8 @@ TEST(IsInstantiated, NotMatchesFunctionDefinition) {
TEST(IsInTemplateInstantiation, MatchesFunctionInstantiationStmt) {
EXPECT_TRUE(
- matches("template<typename T> void A(T t) { T i; } void x() { A(0); }",
- declStmt(isInTemplateInstantiation())));
+ matches("template<typename T> void A(T t) { T i; } void x() { A(0); }",
+ declStmt(isInTemplateInstantiation())));
}
TEST(IsInTemplateInstantiation, NotMatchesFunctionDefinitionStmt) {
@@ -2183,11 +2108,11 @@ TEST(IsInTemplateInstantiation, Sharing) {
// FIXME: Node sharing is an implementation detail, exposing it is ugly
// and makes the matcher behave in non-obvious ways.
EXPECT_TRUE(notMatches(
- "int j; template<typename T> void A(T t) { j += 42; } void x() { A(0); }",
- Matcher));
+ "int j; template<typename T> void A(T t) { j += 42; } void x() { A(0); }",
+ Matcher));
EXPECT_TRUE(matches(
- "int j; template<typename T> void A(T t) { j += t; } void x() { A(0); }",
- Matcher));
+ "int j; template<typename T> void A(T t) { j += t; } void x() { A(0); }",
+ Matcher));
}
TEST(IsInstantiationDependent, MatchesNonValueTypeDependent) {
@@ -2232,48 +2157,41 @@ TEST(IsValueDependent, MatchesInstantiationDependent) {
expr(isValueDependent())));
}
-TEST(IsExplicitTemplateSpecialization,
- DoesNotMatchPrimaryTemplate) {
- EXPECT_TRUE(notMatches(
- "template <typename T> class X {};",
- cxxRecordDecl(isExplicitTemplateSpecialization())));
- EXPECT_TRUE(notMatches(
- "template <typename T> void f(T t);",
- functionDecl(isExplicitTemplateSpecialization())));
+TEST(IsExplicitTemplateSpecialization, DoesNotMatchPrimaryTemplate) {
+ EXPECT_TRUE(notMatches("template <typename T> class X {};",
+ cxxRecordDecl(isExplicitTemplateSpecialization())));
+ EXPECT_TRUE(notMatches("template <typename T> void f(T t);",
+ functionDecl(isExplicitTemplateSpecialization())));
}
TEST(IsExplicitTemplateSpecialization,
DoesNotMatchExplicitTemplateInstantiations) {
- EXPECT_TRUE(notMatches(
- "template <typename T> class X {};"
- "template class X<int>; extern template class X<long>;",
- cxxRecordDecl(isExplicitTemplateSpecialization())));
- EXPECT_TRUE(notMatches(
- "template <typename T> void f(T t) {}"
- "template void f(int t); extern template void f(long t);",
- functionDecl(isExplicitTemplateSpecialization())));
+ EXPECT_TRUE(
+ notMatches("template <typename T> class X {};"
+ "template class X<int>; extern template class X<long>;",
+ cxxRecordDecl(isExplicitTemplateSpecialization())));
+ EXPECT_TRUE(
+ notMatches("template <typename T> void f(T t) {}"
+ "template void f(int t); extern template void f(long t);",
+ functionDecl(isExplicitTemplateSpecialization())));
}
TEST(IsExplicitTemplateSpecialization,
DoesNotMatchImplicitTemplateInstantiations) {
- EXPECT_TRUE(notMatches(
- "template <typename T> class X {}; X<int> x;",
- cxxRecordDecl(isExplicitTemplateSpecialization())));
- EXPECT_TRUE(notMatches(
- "template <typename T> void f(T t); void g() { f(10); }",
- functionDecl(isExplicitTemplateSpecialization())));
+ EXPECT_TRUE(notMatches("template <typename T> class X {}; X<int> x;",
+ cxxRecordDecl(isExplicitTemplateSpecialization())));
+ EXPECT_TRUE(
+ notMatches("template <typename T> void f(T t); void g() { f(10); }",
+ functionDecl(isExplicitTemplateSpecialization())));
}
-TEST(IsExplicitTemplateSpecialization,
- MatchesExplicitTemplateSpecializations) {
- EXPECT_TRUE(matches(
- "template <typename T> class X {};"
- "template<> class X<int> {};",
- cxxRecordDecl(isExplicitTemplateSpecialization())));
- EXPECT_TRUE(matches(
- "template <typename T> void f(T t) {}"
- "template<> void f(int t) {}",
- functionDecl(isExplicitTemplateSpecialization())));
+TEST(IsExplicitTemplateSpecialization, MatchesExplicitTemplateSpecializations) {
+ EXPECT_TRUE(matches("template <typename T> class X {};"
+ "template<> class X<int> {};",
+ cxxRecordDecl(isExplicitTemplateSpecialization())));
+ EXPECT_TRUE(matches("template <typename T> void f(T t) {}"
+ "template<> void f(int t) {}",
+ functionDecl(isExplicitTemplateSpecialization())));
}
TEST(TypeMatching, MatchesNoReturn) {
@@ -2314,8 +2232,8 @@ TEST(TypeMatching, MatchesNoReturn) {
EXPECT_TRUE(
matches("struct S { [[noreturn]] S(); };", functionDecl(isNoReturn())));
- EXPECT_TRUE(matches("struct S { [[noreturn]] S() {} };",
- functionDecl(isNoReturn())));
+ EXPECT_TRUE(
+ matches("struct S { [[noreturn]] S() {} };", functionDecl(isNoReturn())));
// ---
@@ -2344,14 +2262,12 @@ TEST(TypeMatching, MatchesNoReturn) {
// ---
EXPECT_TRUE(matchesC("__attribute__((noreturn)) void func();",
- functionDecl(isNoReturn())));
+ functionDecl(isNoReturn())));
EXPECT_TRUE(matchesC("__attribute__((noreturn)) void func() {}",
- functionDecl(isNoReturn())));
+ functionDecl(isNoReturn())));
- EXPECT_TRUE(matchesC("_Noreturn void func();",
- functionDecl(isNoReturn())));
- EXPECT_TRUE(matchesC("_Noreturn void func() {}",
- functionDecl(isNoReturn())));
+ EXPECT_TRUE(matchesC("_Noreturn void func();", functionDecl(isNoReturn())));
+ EXPECT_TRUE(matchesC("_Noreturn void func() {}", functionDecl(isNoReturn())));
}
TEST(TypeMatching, MatchesBool) {
@@ -2383,45 +2299,42 @@ TEST(TypeMatching, MatchesArrayTypes) {
EXPECT_TRUE(notMatches("struct A {}; A a[7];",
arrayType(hasElementType(builtinType()))));
+ EXPECT_TRUE(matches("int const a[] = { 2, 3 };",
+ qualType(arrayType(hasElementType(builtinType())))));
EXPECT_TRUE(matches(
- "int const a[] = { 2, 3 };",
- qualType(arrayType(hasElementType(builtinType())))));
- EXPECT_TRUE(matches(
- "int const a[] = { 2, 3 };",
- qualType(isConstQualified(), arrayType(hasElementType(builtinType())))));
- EXPECT_TRUE(matches(
- "typedef const int T; T x[] = { 1, 2 };",
- qualType(isConstQualified(), arrayType())));
+ "int const a[] = { 2, 3 };",
+ qualType(isConstQualified(), arrayType(hasElementType(builtinType())))));
+ EXPECT_TRUE(matches("typedef const int T; T x[] = { 1, 2 };",
+ qualType(isConstQualified(), arrayType())));
EXPECT_TRUE(notMatches(
- "int a[] = { 2, 3 };",
- qualType(isConstQualified(), arrayType(hasElementType(builtinType())))));
- EXPECT_TRUE(notMatches(
- "int a[] = { 2, 3 };",
- qualType(arrayType(hasElementType(isConstQualified(), builtinType())))));
+ "int a[] = { 2, 3 };",
+ qualType(isConstQualified(), arrayType(hasElementType(builtinType())))));
EXPECT_TRUE(notMatches(
- "int const a[] = { 2, 3 };",
- qualType(arrayType(hasElementType(builtinType())),
- unless(isConstQualified()))));
+ "int a[] = { 2, 3 };",
+ qualType(arrayType(hasElementType(isConstQualified(), builtinType())))));
+ EXPECT_TRUE(notMatches("int const a[] = { 2, 3 };",
+ qualType(arrayType(hasElementType(builtinType())),
+ unless(isConstQualified()))));
- EXPECT_TRUE(matches("int a[2];",
- constantArrayType(hasElementType(builtinType()))));
+ EXPECT_TRUE(
+ matches("int a[2];", constantArrayType(hasElementType(builtinType()))));
EXPECT_TRUE(matches("const int a = 0;", qualType(isInteger())));
}
TEST(TypeMatching, DecayedType) {
- EXPECT_TRUE(matches("void f(int i[]);", valueDecl(hasType(decayedType(hasDecayedType(pointerType()))))));
+ EXPECT_TRUE(
+ matches("void f(int i[]);",
+ valueDecl(hasType(decayedType(hasDecayedType(pointerType()))))));
EXPECT_TRUE(notMatches("int i[7];", decayedType()));
}
TEST(TypeMatching, MatchesComplexTypes) {
EXPECT_TRUE(matches("_Complex float f;", complexType()));
- EXPECT_TRUE(matches(
- "_Complex float f;",
- complexType(hasElementType(builtinType()))));
- EXPECT_TRUE(notMatches(
- "_Complex float f;",
- complexType(hasElementType(isInteger()))));
+ EXPECT_TRUE(
+ matches("_Complex float f;", complexType(hasElementType(builtinType()))));
+ EXPECT_TRUE(notMatches("_Complex float f;",
+ complexType(hasElementType(isInteger()))));
}
TEST(NS, Anonymous) {
@@ -2482,38 +2395,38 @@ TEST(DeclarationMatcher, InStdNamespace) {
TEST(EqualsBoundNodeMatcher, QualType) {
EXPECT_TRUE(matches(
- "int i = 1;", varDecl(hasType(qualType().bind("type")),
- hasInitializer(ignoringParenImpCasts(
- hasType(qualType(equalsBoundNode("type"))))))));
+ "int i = 1;", varDecl(hasType(qualType().bind("type")),
+ hasInitializer(ignoringParenImpCasts(
+ hasType(qualType(equalsBoundNode("type"))))))));
EXPECT_TRUE(notMatches("int i = 1.f;",
varDecl(hasType(qualType().bind("type")),
hasInitializer(ignoringParenImpCasts(hasType(
- qualType(equalsBoundNode("type"))))))));
+ qualType(equalsBoundNode("type"))))))));
}
TEST(EqualsBoundNodeMatcher, NonMatchingTypes) {
EXPECT_TRUE(notMatches(
- "int i = 1;", varDecl(namedDecl(hasName("i")).bind("name"),
- hasInitializer(ignoringParenImpCasts(
- hasType(qualType(equalsBoundNode("type"))))))));
+ "int i = 1;", varDecl(namedDecl(hasName("i")).bind("name"),
+ hasInitializer(ignoringParenImpCasts(
+ hasType(qualType(equalsBoundNode("type"))))))));
}
TEST(EqualsBoundNodeMatcher, Stmt) {
EXPECT_TRUE(
- matches("void f() { if(true) {} }",
- stmt(allOf(ifStmt().bind("if"),
- hasParent(stmt(has(stmt(equalsBoundNode("if")))))))));
+ matches("void f() { if(true) {} }",
+ stmt(allOf(ifStmt().bind("if"),
+ hasParent(stmt(has(stmt(equalsBoundNode("if")))))))));
EXPECT_TRUE(notMatches(
- "void f() { if(true) { if (true) {} } }",
- stmt(allOf(ifStmt().bind("if"), has(stmt(equalsBoundNode("if")))))));
+ "void f() { if(true) { if (true) {} } }",
+ stmt(allOf(ifStmt().bind("if"), has(stmt(equalsBoundNode("if")))))));
}
TEST(EqualsBoundNodeMatcher, Decl) {
EXPECT_TRUE(matches(
- "class X { class Y {}; };",
- decl(allOf(recordDecl(hasName("::X::Y")).bind("record"),
- hasParent(decl(has(decl(equalsBoundNode("record")))))))));
+ "class X { class Y {}; };",
+ decl(allOf(recordDecl(hasName("::X::Y")).bind("record"),
+ hasParent(decl(has(decl(equalsBoundNode("record")))))))));
EXPECT_TRUE(notMatches("class X { class Y {}; };",
decl(allOf(recordDecl(hasName("::X")).bind("record"),
@@ -2522,21 +2435,21 @@ TEST(EqualsBoundNodeMatcher, Decl) {
TEST(EqualsBoundNodeMatcher, Type) {
EXPECT_TRUE(matches(
- "class X { int a; int b; };",
- recordDecl(
- has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
- has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))));
+ "class X { int a; int b; };",
+ recordDecl(
+ has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
+ has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))));
EXPECT_TRUE(notMatches(
- "class X { int a; double b; };",
- recordDecl(
- has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
- has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))));
+ "class X { int a; double b; };",
+ recordDecl(
+ has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
+ has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))));
}
TEST(EqualsBoundNodeMatcher, UsingForEachDescendant) {
EXPECT_TRUE(matchAndVerifyResultTrue(
- "int f() {"
+ "int f() {"
" if (1) {"
" int i = 9;"
" }"
@@ -2546,63 +2459,65 @@ TEST(EqualsBoundNodeMatcher, UsingForEachDescendant) {
" }"
" return 0;"
"}",
- // Look for variable declarations within functions whose type is the same
- // as the function return type.
- functionDecl(returns(qualType().bind("type")),
- forEachDescendant(varDecl(hasType(
- qualType(equalsBoundNode("type")))).bind("decl"))),
- // Only i and j should match, not k.
- std::make_unique<VerifyIdIsBoundTo<VarDecl>>("decl", 2)));
+ // Look for variable declarations within functions whose type is the same
+ // as the function return type.
+ functionDecl(
+ returns(qualType().bind("type")),
+ forEachDescendant(varDecl(hasType(qualType(equalsBoundNode("type"))))
+ .bind("decl"))),
+ // Only i and j should match, not k.
+ std::make_unique<VerifyIdIsBoundTo<VarDecl>>("decl", 2)));
}
TEST(EqualsBoundNodeMatcher, FiltersMatchedCombinations) {
EXPECT_TRUE(matchAndVerifyResultTrue(
- "void f() {"
+ "void f() {"
" int x;"
" double d;"
" x = d + x - d + x;"
"}",
- functionDecl(
- hasName("f"), forEachDescendant(varDecl().bind("d")),
- forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d")))))),
- std::make_unique<VerifyIdIsBoundTo<VarDecl>>("d", 5)));
+ functionDecl(
+ hasName("f"), forEachDescendant(varDecl().bind("d")),
+ forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d")))))),
+ std::make_unique<VerifyIdIsBoundTo<VarDecl>>("d", 5)));
}
TEST(EqualsBoundNodeMatcher, UnlessDescendantsOfAncestorsMatch) {
EXPECT_TRUE(matchAndVerifyResultTrue(
- "struct StringRef { int size() const; const char* data() const; };"
+ "struct StringRef { int size() const; const char* data() const; };"
"void f(StringRef v) {"
" v.data();"
"}",
- cxxMemberCallExpr(
- callee(cxxMethodDecl(hasName("data"))),
- on(declRefExpr(to(
- varDecl(hasType(recordDecl(hasName("StringRef")))).bind("var")))),
- unless(hasAncestor(stmt(hasDescendant(cxxMemberCallExpr(
- callee(cxxMethodDecl(anyOf(hasName("size"), hasName("length")))),
- on(declRefExpr(to(varDecl(equalsBoundNode("var")))))))))))
- .bind("data"),
- std::make_unique<VerifyIdIsBoundTo<Expr>>("data", 1)));
+ cxxMemberCallExpr(
+ callee(cxxMethodDecl(hasName("data"))),
+ on(declRefExpr(to(
+ varDecl(hasType(recordDecl(hasName("StringRef")))).bind("var")))),
+ unless(hasAncestor(stmt(hasDescendant(cxxMemberCallExpr(
+ callee(cxxMethodDecl(anyOf(hasName("size"), hasName("length")))),
+ on(declRefExpr(to(varDecl(equalsBoundNode("var")))))))))))
+ .bind("data"),
+ std::make_unique<VerifyIdIsBoundTo<Expr>>("data", 1)));
EXPECT_FALSE(matches(
- "struct StringRef { int size() const; const char* data() const; };"
+ "struct StringRef { int size() const; const char* data() const; };"
"void f(StringRef v) {"
" v.data();"
" v.size();"
"}",
- cxxMemberCallExpr(
- callee(cxxMethodDecl(hasName("data"))),
- on(declRefExpr(to(
- varDecl(hasType(recordDecl(hasName("StringRef")))).bind("var")))),
- unless(hasAncestor(stmt(hasDescendant(cxxMemberCallExpr(
- callee(cxxMethodDecl(anyOf(hasName("size"), hasName("length")))),
- on(declRefExpr(to(varDecl(equalsBoundNode("var")))))))))))
- .bind("data")));
+ cxxMemberCallExpr(
+ callee(cxxMethodDecl(hasName("data"))),
+ on(declRefExpr(to(
+ varDecl(hasType(recordDecl(hasName("StringRef")))).bind("var")))),
+ unless(hasAncestor(stmt(hasDescendant(cxxMemberCallExpr(
+ callee(cxxMethodDecl(anyOf(hasName("size"), hasName("length")))),
+ on(declRefExpr(to(varDecl(equalsBoundNode("var")))))))))))
+ .bind("data")));
}
TEST(NullPointerConstants, Basic) {
EXPECT_TRUE(matches("#define NULL ((void *)0)\n"
- "void *v1 = NULL;", expr(nullPointerConstant())));
+ "void *v1 = NULL;",
+ expr(nullPointerConstant())));
EXPECT_TRUE(matches("void *v2 = nullptr;", expr(nullPointerConstant())));
EXPECT_TRUE(matches("void *v3 = __null;", expr(nullPointerConstant())));
EXPECT_TRUE(matches("char *cp = (char *)0;", expr(nullPointerConstant())));
@@ -2635,10 +2550,10 @@ TEST(HasExternalFormalLinkage, Basic) {
}
TEST(HasDefaultArgument, Basic) {
- EXPECT_TRUE(matches("void x(int val = 0) {}",
- parmVarDecl(hasDefaultArgument())));
- EXPECT_TRUE(notMatches("void x(int val) {}",
- parmVarDecl(hasDefaultArgument())));
+ EXPECT_TRUE(
+ matches("void x(int val = 0) {}", parmVarDecl(hasDefaultArgument())));
+ EXPECT_TRUE(
+ notMatches("void x(int val) {}", parmVarDecl(hasDefaultArgument())));
}
TEST(IsAtPosition, Basic) {
@@ -2691,24 +2606,18 @@ TEST(HasArraySize, Basic) {
}
TEST(HasDefinition, MatchesStructDefinition) {
- EXPECT_TRUE(matches("struct x {};",
- cxxRecordDecl(hasDefinition())));
- EXPECT_TRUE(notMatches("struct x;",
- cxxRecordDecl(hasDefinition())));
+ EXPECT_TRUE(matches("struct x {};", cxxRecordDecl(hasDefinition())));
+ EXPECT_TRUE(notMatches("struct x;", cxxRecordDecl(hasDefinition())));
}
TEST(HasDefinition, MatchesClassDefinition) {
- EXPECT_TRUE(matches("class x {};",
- cxxRecordDecl(hasDefinition())));
- EXPECT_TRUE(notMatches("class x;",
- cxxRecordDecl(hasDefinition())));
+ EXPECT_TRUE(matches("class x {};", cxxRecordDecl(hasDefinition())));
+ EXPECT_TRUE(notMatches("class x;", cxxRecordDecl(hasDefinition())));
}
TEST(HasDefinition, MatchesUnionDefinition) {
- EXPECT_TRUE(matches("union x {};",
- cxxRecordDecl(hasDefinition())));
- EXPECT_TRUE(notMatches("union x;",
- cxxRecordDecl(hasDefinition())));
+ EXPECT_TRUE(matches("union x {};", cxxRecordDecl(hasDefinition())));
+ EXPECT_TRUE(notMatches("union x;", cxxRecordDecl(hasDefinition())));
}
TEST(IsScopedEnum, MatchesScopedEnum) {
@@ -2727,19 +2636,19 @@ TEST(HasTrailingReturn, MatchesTrailingReturn) {
EXPECT_TRUE(matches("auto Y() -> int { return 0; }",
functionDecl(hasTrailingReturn())));
EXPECT_TRUE(matches("auto X() -> int;", functionDecl(hasTrailingReturn())));
- EXPECT_TRUE(notMatches("int X() { return 0; }",
- functionDecl(hasTrailingReturn())));
+ EXPECT_TRUE(
+ notMatches("int X() { return 0; }", functionDecl(hasTrailingReturn())));
EXPECT_TRUE(notMatches("int X();", functionDecl(hasTrailingReturn())));
EXPECT_TRUE(notMatchesC("void X();", functionDecl(hasTrailingReturn())));
}
TEST(HasTrailingReturn, MatchesLambdaTrailingReturn) {
EXPECT_TRUE(matches(
- "auto lambda2 = [](double x, double y) -> double {return x + y;};",
- functionDecl(hasTrailingReturn())));
- EXPECT_TRUE(notMatches(
- "auto lambda2 = [](double x, double y) {return x + y;};",
- functionDecl(hasTrailingReturn())));
+ "auto lambda2 = [](double x, double y) -> double {return x + y;};",
+ functionDecl(hasTrailingReturn())));
+ EXPECT_TRUE(
+ notMatches("auto lambda2 = [](double x, double y) {return x + y;};",
+ functionDecl(hasTrailingReturn())));
}
TEST(IsAssignmentOperator, Basic) {
@@ -2772,23 +2681,15 @@ TEST(IsComparisonOperator, Basic) {
}
TEST(HasInit, Basic) {
- EXPECT_TRUE(
- matches("int x{0};",
- initListExpr(hasInit(0, expr()))));
- EXPECT_FALSE(
- matches("int x{0};",
- initListExpr(hasInit(1, expr()))));
- EXPECT_FALSE(
- matches("int x;",
- initListExpr(hasInit(0, expr()))));
+ EXPECT_TRUE(matches("int x{0};", initListExpr(hasInit(0, expr()))));
+ EXPECT_FALSE(matches("int x{0};", initListExpr(hasInit(1, expr()))));
+ EXPECT_FALSE(matches("int x;", initListExpr(hasInit(0, expr()))));
}
TEST(Matcher, isMain) {
- EXPECT_TRUE(
- matches("int main() {}", functionDecl(isMain())));
+ EXPECT_TRUE(matches("int main() {}", functionDecl(isMain())));
- EXPECT_TRUE(
- notMatches("int main2() {}", functionDecl(isMain())));
+ EXPECT_TRUE(notMatches("int main2() {}", functionDecl(isMain())));
}
TEST(OMPExecutableDirective, isStandaloneDirective) {
@@ -2867,11 +2768,18 @@ void x() {
EXPECT_TRUE(matchesWithOpenMP(Source3, Matcher));
StringRef Source4 = R"(
+void x() {
+#pragma omp parallel default(firstprivate)
+;
+})";
+ EXPECT_TRUE(matchesWithOpenMP51(Source4, Matcher));
+
+ StringRef Source5 = R"(
void x(int x) {
#pragma omp parallel num_threads(x)
;
})";
- EXPECT_TRUE(matchesWithOpenMP(Source4, Matcher));
+ EXPECT_TRUE(matchesWithOpenMP(Source5, Matcher));
}
TEST(OMPDefaultClause, isNoneKind) {
@@ -2907,10 +2815,17 @@ void x() {
StringRef Source4 = R"(
void x(int x) {
+#pragma omp parallel default(firstprivate)
+;
+})";
+ EXPECT_TRUE(notMatchesWithOpenMP51(Source4, Matcher));
+
+ const std::string Source5 = R"(
+void x(int x) {
#pragma omp parallel num_threads(x)
;
})";
- EXPECT_TRUE(notMatchesWithOpenMP(Source4, Matcher));
+ EXPECT_TRUE(notMatchesWithOpenMP(Source5, Matcher));
}
TEST(OMPDefaultClause, isSharedKind) {
@@ -2946,10 +2861,63 @@ void x() {
StringRef Source4 = R"(
void x(int x) {
+#pragma omp parallel default(firstprivate)
+;
+})";
+ EXPECT_TRUE(notMatchesWithOpenMP51(Source4, Matcher));
+
+ const std::string Source5 = R"(
+void x(int x) {
#pragma omp parallel num_threads(x)
;
})";
- EXPECT_TRUE(notMatchesWithOpenMP(Source4, Matcher));
+ EXPECT_TRUE(notMatchesWithOpenMP(Source5, Matcher));
+}
+
+TEST(OMPDefaultClause, isFirstPrivateKind) {
+ auto Matcher = ompExecutableDirective(
+ hasAnyClause(ompDefaultClause(isFirstPrivateKind())));
+
+ const std::string Source0 = R"(
+void x() {
+;
+})";
+ EXPECT_TRUE(notMatchesWithOpenMP(Source0, Matcher));
+
+ const std::string Source1 = R"(
+void x() {
+#pragma omp parallel
+;
+})";
+ EXPECT_TRUE(notMatchesWithOpenMP(Source1, Matcher));
+
+ const std::string Source2 = R"(
+void x() {
+#pragma omp parallel default(shared)
+;
+})";
+ EXPECT_TRUE(notMatchesWithOpenMP(Source2, Matcher));
+
+ const std::string Source3 = R"(
+void x() {
+#pragma omp parallel default(none)
+;
+})";
+ EXPECT_TRUE(notMatchesWithOpenMP(Source3, Matcher));
+
+ const std::string Source4 = R"(
+void x(int x) {
+#pragma omp parallel default(firstprivate)
+;
+})";
+ EXPECT_TRUE(matchesWithOpenMP51(Source4, Matcher));
+
+ const std::string Source5 = R"(
+void x(int x) {
+#pragma omp parallel num_threads(x)
+;
+})";
+ EXPECT_TRUE(notMatchesWithOpenMP(Source5, Matcher));
}
TEST(OMPExecutableDirective, isAllowedToContainClauseKind) {
@@ -2984,24 +2952,31 @@ void x() {
EXPECT_TRUE(matchesWithOpenMP(Source3, Matcher));
StringRef Source4 = R"(
+void x() {
+#pragma omp parallel default(firstprivate)
+;
+})";
+ EXPECT_TRUE(matchesWithOpenMP51(Source4, Matcher));
+
+ StringRef Source5 = R"(
void x(int x) {
#pragma omp parallel num_threads(x)
;
})";
- EXPECT_TRUE(matchesWithOpenMP(Source4, Matcher));
+ EXPECT_TRUE(matchesWithOpenMP(Source5, Matcher));
- StringRef Source5 = R"(
+ StringRef Source6 = R"(
void x() {
#pragma omp taskyield
})";
- EXPECT_TRUE(notMatchesWithOpenMP(Source5, Matcher));
+ EXPECT_TRUE(notMatchesWithOpenMP(Source6, Matcher));
- StringRef Source6 = R"(
+ StringRef Source7 = R"(
void x() {
#pragma omp task
;
})";
- EXPECT_TRUE(matchesWithOpenMP(Source6, Matcher));
+ EXPECT_TRUE(matchesWithOpenMP(Source7, Matcher));
}
TEST(HasAnyBase, DirectBase) {
diff --git a/clang/unittests/ASTMatchers/ASTMatchersNodeTest.cpp b/clang/unittests/ASTMatchers/ASTMatchersNodeTest.cpp
index 59e0f74b3910..895c8ae48adc 100644
--- a/clang/unittests/ASTMatchers/ASTMatchersNodeTest.cpp
+++ b/clang/unittests/ASTMatchers/ASTMatchersNodeTest.cpp
@@ -118,13 +118,13 @@ TEST_P(ASTMatchersTest, TranslationUnitDecl) {
"int MyVar2;\n"
"} // namespace NameSpace\n";
EXPECT_TRUE(matches(
- Code, varDecl(hasName("MyVar1"), hasDeclContext(translationUnitDecl()))));
+ Code, varDecl(hasName("MyVar1"), hasDeclContext(translationUnitDecl()))));
EXPECT_FALSE(matches(
- Code, varDecl(hasName("MyVar2"), hasDeclContext(translationUnitDecl()))));
+ Code, varDecl(hasName("MyVar2"), hasDeclContext(translationUnitDecl()))));
EXPECT_TRUE(matches(
- Code,
- varDecl(hasName("MyVar2"),
- hasDeclContext(decl(hasDeclContext(translationUnitDecl()))))));
+ Code,
+ varDecl(hasName("MyVar2"),
+ hasDeclContext(decl(hasDeclContext(translationUnitDecl()))))));
}
TEST_P(ASTMatchersTest, LinkageSpecDecl) {
@@ -158,10 +158,10 @@ TEST_P(ASTMatchersTest,
if (!GetParam().isCXX()) {
return;
}
- EXPECT_TRUE(notMatches("template<typename T> class X { };"
- "template<> class X<int> { int a; };",
- classTemplateDecl(hasName("X"),
- hasDescendant(fieldDecl(hasName("a"))))));
+ EXPECT_TRUE(notMatches(
+ "template<typename T> class X { };"
+ "template<> class X<int> { int a; };",
+ classTemplateDecl(hasName("X"), hasDescendant(fieldDecl(hasName("a"))))));
}
TEST_P(ASTMatchersTest,
@@ -169,18 +169,17 @@ TEST_P(ASTMatchersTest,
if (!GetParam().isCXX()) {
return;
}
- EXPECT_TRUE(notMatches("template<typename T, typename U> class X { };"
- "template<typename T> class X<T, int> { int a; };",
- classTemplateDecl(hasName("X"),
- hasDescendant(fieldDecl(hasName("a"))))));
+ EXPECT_TRUE(notMatches(
+ "template<typename T, typename U> class X { };"
+ "template<typename T> class X<T, int> { int a; };",
+ classTemplateDecl(hasName("X"), hasDescendant(fieldDecl(hasName("a"))))));
}
TEST(ASTMatchersTestCUDA, CUDAKernelCallExpr) {
EXPECT_TRUE(matchesWithCuda("__global__ void f() { }"
- "void g() { f<<<1, 2>>>(); }",
+ "void g() { f<<<1, 2>>>(); }",
cudaKernelCallExpr()));
- EXPECT_TRUE(notMatchesWithCuda("void f() {}",
- cudaKernelCallExpr()));
+ EXPECT_TRUE(notMatchesWithCuda("void f() {}", cudaKernelCallExpr()));
}
TEST(ASTMatchersTestCUDA, HasAttrCUDA) {
@@ -316,56 +315,50 @@ TEST_P(ASTMatchersTest, CallExpr_CXX) {
// FIXME: Do we want to overload Call() to directly take
// Matcher<Decl>, too?
StatementMatcher MethodX =
- callExpr(hasDeclaration(cxxMethodDecl(hasName("x"))));
+ callExpr(hasDeclaration(cxxMethodDecl(hasName("x"))));
EXPECT_TRUE(matches("class Y { void x() { x(); } };", MethodX));
EXPECT_TRUE(notMatches("class Y { void x() {} };", MethodX));
StatementMatcher MethodOnY =
- cxxMemberCallExpr(on(hasType(recordDecl(hasName("Y")))));
+ cxxMemberCallExpr(on(hasType(recordDecl(hasName("Y")))));
- EXPECT_TRUE(
- matches("class Y { public: void x(); }; void z() { Y y; y.x(); }",
- MethodOnY));
- EXPECT_TRUE(
- matches("class Y { public: void x(); }; void z(Y &y) { y.x(); }",
- MethodOnY));
- EXPECT_TRUE(
- notMatches("class Y { public: void x(); }; void z(Y *&y) { y->x(); }",
- MethodOnY));
- EXPECT_TRUE(
- notMatches("class Y { public: void x(); }; void z(Y y[]) { y->x(); }",
- MethodOnY));
- EXPECT_TRUE(
- notMatches("class Y { public: void x(); }; void z() { Y *y; y->x(); }",
- MethodOnY));
+ EXPECT_TRUE(matches("class Y { public: void x(); }; void z() { Y y; y.x(); }",
+ MethodOnY));
+ EXPECT_TRUE(matches("class Y { public: void x(); }; void z(Y &y) { y.x(); }",
+ MethodOnY));
+ EXPECT_TRUE(notMatches(
+ "class Y { public: void x(); }; void z(Y *&y) { y->x(); }", MethodOnY));
+ EXPECT_TRUE(notMatches(
+ "class Y { public: void x(); }; void z(Y y[]) { y->x(); }", MethodOnY));
+ EXPECT_TRUE(notMatches(
+ "class Y { public: void x(); }; void z() { Y *y; y->x(); }", MethodOnY));
StatementMatcher MethodOnYPointer =
- cxxMemberCallExpr(on(hasType(pointsTo(recordDecl(hasName("Y"))))));
+ cxxMemberCallExpr(on(hasType(pointsTo(recordDecl(hasName("Y"))))));
EXPECT_TRUE(
- matches("class Y { public: void x(); }; void z() { Y *y; y->x(); }",
- MethodOnYPointer));
+ matches("class Y { public: void x(); }; void z() { Y *y; y->x(); }",
+ MethodOnYPointer));
EXPECT_TRUE(
- matches("class Y { public: void x(); }; void z(Y *&y) { y->x(); }",
- MethodOnYPointer));
+ matches("class Y { public: void x(); }; void z(Y *&y) { y->x(); }",
+ MethodOnYPointer));
EXPECT_TRUE(
- matches("class Y { public: void x(); }; void z(Y y[]) { y->x(); }",
- MethodOnYPointer));
+ matches("class Y { public: void x(); }; void z(Y y[]) { y->x(); }",
+ MethodOnYPointer));
EXPECT_TRUE(
- notMatches("class Y { public: void x(); }; void z() { Y y; y.x(); }",
- MethodOnYPointer));
+ notMatches("class Y { public: void x(); }; void z() { Y y; y.x(); }",
+ MethodOnYPointer));
EXPECT_TRUE(
- notMatches("class Y { public: void x(); }; void z(Y &y) { y.x(); }",
- MethodOnYPointer));
+ notMatches("class Y { public: void x(); }; void z(Y &y) { y.x(); }",
+ MethodOnYPointer));
}
TEST_P(ASTMatchersTest, LambdaExpr) {
if (!GetParam().isCXX11OrLater()) {
return;
}
- EXPECT_TRUE(matches("auto f = [] (int i) { return i; };",
- lambdaExpr()));
+ EXPECT_TRUE(matches("auto f = [] (int i) { return i; };", lambdaExpr()));
}
TEST_P(ASTMatchersTest, CXXForRangeStmt) {
@@ -378,7 +371,7 @@ TEST_P(ASTMatchersTest, CXXForRangeStmt_CXX11) {
return;
}
EXPECT_TRUE(matches("int as[] = { 1, 2, 3 };"
- "void f() { for (auto &a : as); }",
+ "void f() { for (auto &a : as); }",
cxxForRangeStmt()));
}
@@ -387,15 +380,13 @@ TEST_P(ASTMatchersTest, SubstNonTypeTemplateParmExpr) {
return;
}
EXPECT_FALSE(matches("template<int N>\n"
- "struct A { static const int n = 0; };\n"
- "struct B : public A<42> {};",
- traverse(TK_AsIs,
- substNonTypeTemplateParmExpr())));
+ "struct A { static const int n = 0; };\n"
+ "struct B : public A<42> {};",
+ traverse(TK_AsIs, substNonTypeTemplateParmExpr())));
EXPECT_TRUE(matches("template<int N>\n"
- "struct A { static const int n = N; };\n"
- "struct B : public A<42> {};",
- traverse(TK_AsIs,
- substNonTypeTemplateParmExpr())));
+ "struct A { static const int n = N; };\n"
+ "struct B : public A<42> {};",
+ traverse(TK_AsIs, substNonTypeTemplateParmExpr())));
}
TEST_P(ASTMatchersTest, NonTypeTemplateParmDecl) {
@@ -405,7 +396,7 @@ TEST_P(ASTMatchersTest, NonTypeTemplateParmDecl) {
EXPECT_TRUE(matches("template <int N> void f();",
nonTypeTemplateParmDecl(hasName("N"))));
EXPECT_TRUE(
- notMatches("template <typename T> void f();", nonTypeTemplateParmDecl()));
+ notMatches("template <typename T> void f();", nonTypeTemplateParmDecl()));
}
TEST_P(ASTMatchersTest, TemplateTypeParmDecl) {
@@ -414,8 +405,7 @@ TEST_P(ASTMatchersTest, TemplateTypeParmDecl) {
}
EXPECT_TRUE(matches("template <typename T> void f();",
templateTypeParmDecl(hasName("T"))));
- EXPECT_TRUE(
- notMatches("template <int N> void f();", templateTypeParmDecl()));
+ EXPECT_TRUE(notMatches("template <int N> void f();", templateTypeParmDecl()));
}
TEST_P(ASTMatchersTest, UserDefinedLiteral) {
@@ -423,9 +413,9 @@ TEST_P(ASTMatchersTest, UserDefinedLiteral) {
return;
}
EXPECT_TRUE(matches("constexpr char operator \"\" _inc (const char i) {"
- " return i + 1;"
- "}"
- "char c = 'a'_inc;",
+ " return i + 1;"
+ "}"
+ "char c = 'a'_inc;",
userDefinedLiteral()));
}
@@ -434,9 +424,7 @@ TEST_P(ASTMatchersTest, FlowControl) {
EXPECT_TRUE(matches("void f() { while(1) { continue; } }", continueStmt()));
EXPECT_TRUE(matches("void f() { goto FOO; FOO: ;}", gotoStmt()));
EXPECT_TRUE(matches("void f() { goto FOO; FOO: ;}",
- labelStmt(
- hasDeclaration(
- labelDecl(hasName("FOO"))))));
+ labelStmt(hasDeclaration(labelDecl(hasName("FOO"))))));
EXPECT_TRUE(matches("void f() { FOO: ; void *ptr = &&FOO; goto *ptr; }",
addrLabelExpr()));
EXPECT_TRUE(matches("void f() { return; }", returnStmt()));
@@ -450,8 +438,9 @@ TEST_P(ASTMatchersTest, CXXOperatorCallExpr) {
StatementMatcher OpCall = cxxOperatorCallExpr();
// Unary operator
EXPECT_TRUE(matches("class Y { }; "
- "bool operator!(Y x) { return false; }; "
- "Y y; bool c = !y;", OpCall));
+ "bool operator!(Y x) { return false; }; "
+ "Y y; bool c = !y;",
+ OpCall));
// No match -- special operators like "new", "delete"
// FIXME: operator new takes size_t, for which we need stddef.h, for which
// we need to figure out include paths in the test.
@@ -460,12 +449,13 @@ TEST_P(ASTMatchersTest, CXXOperatorCallExpr) {
// "void *operator new(size_t size) { return 0; } "
// "Y *y = new Y;", OpCall));
EXPECT_TRUE(notMatches("class Y { }; "
- "void operator delete(void *p) { } "
- "void a() {Y *y = new Y; delete y;}", OpCall));
+ "void operator delete(void *p) { } "
+ "void a() {Y *y = new Y; delete y;}",
+ OpCall));
// Binary operator
EXPECT_TRUE(matches("class Y { }; "
- "bool operator&&(Y x, Y y) { return true; }; "
- "Y a; Y b; bool c = a && b;",
+ "bool operator&&(Y x, Y y) { return true; }; "
+ "Y a; Y b; bool c = a && b;",
OpCall));
// No match -- normal operator, not an overloaded one.
EXPECT_TRUE(notMatches("bool x = true, y = true; bool t = x && y;", OpCall));
@@ -481,30 +471,25 @@ TEST_P(ASTMatchersTest, ThisPointerType) {
traverse(ast_type_traits::TK_AsIs,
cxxMemberCallExpr(thisPointerType(recordDecl(hasName("Y")))));
- EXPECT_TRUE(
- matches("class Y { public: void x(); }; void z() { Y y; y.x(); }",
- MethodOnY));
- EXPECT_TRUE(
- matches("class Y { public: void x(); }; void z(Y &y) { y.x(); }",
- MethodOnY));
- EXPECT_TRUE(
- matches("class Y { public: void x(); }; void z(Y *&y) { y->x(); }",
- MethodOnY));
- EXPECT_TRUE(
- matches("class Y { public: void x(); }; void z(Y y[]) { y->x(); }",
- MethodOnY));
- EXPECT_TRUE(
- matches("class Y { public: void x(); }; void z() { Y *y; y->x(); }",
- MethodOnY));
-
+ EXPECT_TRUE(matches("class Y { public: void x(); }; void z() { Y y; y.x(); }",
+ MethodOnY));
+ EXPECT_TRUE(matches("class Y { public: void x(); }; void z(Y &y) { y.x(); }",
+ MethodOnY));
EXPECT_TRUE(matches(
- "class Y {"
- " public: virtual void x();"
- "};"
- "class X : public Y {"
- " public: virtual void x();"
- "};"
- "void z() { X *x; x->Y::x(); }", MethodOnY));
+ "class Y { public: void x(); }; void z(Y *&y) { y->x(); }", MethodOnY));
+ EXPECT_TRUE(matches(
+ "class Y { public: void x(); }; void z(Y y[]) { y->x(); }", MethodOnY));
+ EXPECT_TRUE(matches(
+ "class Y { public: void x(); }; void z() { Y *y; y->x(); }", MethodOnY));
+
+ EXPECT_TRUE(matches("class Y {"
+ " public: virtual void x();"
+ "};"
+ "class X : public Y {"
+ " public: virtual void x();"
+ "};"
+ "void z() { X *x; x->Y::x(); }",
+ MethodOnY));
}
TEST_P(ASTMatchersTest, DeclRefExpr) {
@@ -512,29 +497,27 @@ TEST_P(ASTMatchersTest, DeclRefExpr) {
// FIXME: Add a test for `declRefExpr()` that does not depend on C++.
return;
}
- StatementMatcher Reference =
- declRefExpr(to(
- varDecl(hasInitializer(
- cxxMemberCallExpr(thisPointerType(recordDecl(hasName("Y"))))))));
+ StatementMatcher Reference = declRefExpr(to(varDecl(hasInitializer(
+ cxxMemberCallExpr(thisPointerType(recordDecl(hasName("Y"))))))));
- EXPECT_TRUE(matches(
- "class Y {"
- " public:"
- " bool x() const;"
- "};"
- "void z(const Y &y) {"
- " bool b = y.x();"
- " if (b) {}"
- "}", Reference));
+ EXPECT_TRUE(matches("class Y {"
+ " public:"
+ " bool x() const;"
+ "};"
+ "void z(const Y &y) {"
+ " bool b = y.x();"
+ " if (b) {}"
+ "}",
+ Reference));
- EXPECT_TRUE(notMatches(
- "class Y {"
- " public:"
- " bool x() const;"
- "};"
- "void z(const Y &y) {"
- " bool b = y.x();"
- "}", Reference));
+ EXPECT_TRUE(notMatches("class Y {"
+ " public:"
+ " bool x() const;"
+ "};"
+ "void z(const Y &y) {"
+ " bool b = y.x();"
+ "}",
+ Reference));
}
TEST_P(ASTMatchersTest, CXXMemberCallExpr) {
@@ -542,32 +525,32 @@ TEST_P(ASTMatchersTest, CXXMemberCallExpr) {
return;
}
StatementMatcher CallOnVariableY =
- cxxMemberCallExpr(on(declRefExpr(to(varDecl(hasName("y"))))));
-
- EXPECT_TRUE(matches(
- "class Y { public: void x() { Y y; y.x(); } };", CallOnVariableY));
- EXPECT_TRUE(matches(
- "class Y { public: void x() const { Y y; y.x(); } };", CallOnVariableY));
- EXPECT_TRUE(matches(
- "class Y { public: void x(); };"
- "class X : public Y { void z() { X y; y.x(); } };", CallOnVariableY));
- EXPECT_TRUE(matches(
- "class Y { public: void x(); };"
- "class X : public Y { void z() { X *y; y->x(); } };", CallOnVariableY));
+ cxxMemberCallExpr(on(declRefExpr(to(varDecl(hasName("y"))))));
+
+ EXPECT_TRUE(matches("class Y { public: void x() { Y y; y.x(); } };",
+ CallOnVariableY));
+ EXPECT_TRUE(matches("class Y { public: void x() const { Y y; y.x(); } };",
+ CallOnVariableY));
+ EXPECT_TRUE(matches("class Y { public: void x(); };"
+ "class X : public Y { void z() { X y; y.x(); } };",
+ CallOnVariableY));
+ EXPECT_TRUE(matches("class Y { public: void x(); };"
+ "class X : public Y { void z() { X *y; y->x(); } };",
+ CallOnVariableY));
EXPECT_TRUE(notMatches(
- "class Y { public: void x(); };"
+ "class Y { public: void x(); };"
"class X : public Y { void z() { unsigned long y; ((X*)y)->x(); } };",
- CallOnVariableY));
+ CallOnVariableY));
}
TEST_P(ASTMatchersTest, UnaryExprOrTypeTraitExpr) {
- EXPECT_TRUE(matches("void x() { int a = sizeof(a); }",
- unaryExprOrTypeTraitExpr()));
+ EXPECT_TRUE(
+ matches("void x() { int a = sizeof(a); }", unaryExprOrTypeTraitExpr()));
}
TEST_P(ASTMatchersTest, AlignOfExpr) {
- EXPECT_TRUE(notMatches("void x() { int a = sizeof(a); }",
- alignOfExpr(anything())));
+ EXPECT_TRUE(
+ notMatches("void x() { int a = sizeof(a); }", alignOfExpr(anything())));
// FIXME: Uncomment once alignof is enabled.
// EXPECT_TRUE(matches("void x() { int a = alignof(a); }",
// unaryExprOrTypeTraitExpr()));
@@ -603,11 +586,10 @@ TEST_P(ASTMatchersTest, MemberExpr_MatchesVariable) {
return;
}
EXPECT_TRUE(
- matches("class Y { void x() { this->y; } int y; };", memberExpr()));
- EXPECT_TRUE(
- matches("class Y { void x() { y; } int y; };", memberExpr()));
+ matches("class Y { void x() { this->y; } int y; };", memberExpr()));
+ EXPECT_TRUE(matches("class Y { void x() { y; } int y; };", memberExpr()));
EXPECT_TRUE(
- matches("class Y { void x() { Y y; y.y; } int y; };", memberExpr()));
+ matches("class Y { void x() { Y y; y.y; } int y; };", memberExpr()));
EXPECT_TRUE(matches("template <class T>"
"class X : T { void f() { this->T::v; } };",
cxxDependentScopeMemberExpr()));
@@ -623,8 +605,8 @@ TEST_P(ASTMatchersTest, MemberExpr_MatchesStaticVariable) {
}
EXPECT_TRUE(matches("class Y { void x() { this->y; } static int y; };",
memberExpr()));
- EXPECT_TRUE(notMatches("class Y { void x() { y; } static int y; };",
- memberExpr()));
+ EXPECT_TRUE(
+ notMatches("class Y { void x() { y; } static int y; };", memberExpr()));
EXPECT_TRUE(notMatches("class Y { void x() { Y::y; } static int y; };",
memberExpr()));
}
@@ -658,21 +640,21 @@ TEST_P(ASTMatchersTest, FunctionDecl_CXX) {
if (!GetParam().hasDelayedTemplateParsing()) {
// FIXME: Fix this test to work with delayed template parsing.
// Dependent contexts, but a non-dependent call.
- EXPECT_TRUE(matches("void f(); template <int N> void g() { f(); }",
- CallFunctionF));
EXPECT_TRUE(
- matches("void f(); template <int N> struct S { void g() { f(); } };",
- CallFunctionF));
+ matches("void f(); template <int N> void g() { f(); }", CallFunctionF));
+ EXPECT_TRUE(
+ matches("void f(); template <int N> struct S { void g() { f(); } };",
+ CallFunctionF));
}
// Depedent calls don't match.
EXPECT_TRUE(
- notMatches("void f(int); template <typename T> void g(T t) { f(t); }",
- CallFunctionF));
+ notMatches("void f(int); template <typename T> void g(T t) { f(t); }",
+ CallFunctionF));
EXPECT_TRUE(
- notMatches("void f(int);"
+ notMatches("void f(int);"
"template <typename T> struct S { void g(T t) { f(t); } };",
- CallFunctionF));
+ CallFunctionF));
EXPECT_TRUE(matches("void f(...);", functionDecl(isVariadic())));
EXPECT_TRUE(matches("void f(...);", functionDecl(parameterCountIs(0))));
@@ -692,9 +674,8 @@ TEST_P(ASTMatchersTest,
if (!GetParam().isCXX()) {
return;
}
- EXPECT_TRUE(
- matches("template <typename T> void f(T t) {}",
- functionTemplateDecl(hasName("f"))));
+ EXPECT_TRUE(matches("template <typename T> void f(T t) {}",
+ functionTemplateDecl(hasName("f"))));
}
TEST_P(ASTMatchersTest, FunctionTemplate_DoesNotMatchFunctionDeclarations) {
@@ -709,12 +690,11 @@ TEST_P(ASTMatchersTest,
if (!GetParam().isCXX()) {
return;
}
- EXPECT_TRUE(
- notMatches("void g(); template <typename T> void f(T t) {}"
- "template <> void f(int t) { g(); }",
- functionTemplateDecl(hasName("f"),
- hasDescendant(declRefExpr(to(
- functionDecl(hasName("g"))))))));
+ EXPECT_TRUE(notMatches(
+ "void g(); template <typename T> void f(T t) {}"
+ "template <> void f(int t) { g(); }",
+ functionTemplateDecl(hasName("f"), hasDescendant(declRefExpr(to(
+ functionDecl(hasName("g"))))))));
}
TEST_P(ASTMatchersTest, ClassTemplateSpecializationDecl) {
@@ -722,7 +702,7 @@ TEST_P(ASTMatchersTest, ClassTemplateSpecializationDecl) {
return;
}
EXPECT_TRUE(matches("template<typename T> struct A {};"
- "template<> struct A<int> {};",
+ "template<> struct A<int> {};",
classTemplateSpecializationDecl()));
EXPECT_TRUE(matches("template<typename T> struct A {}; A<int> a;",
classTemplateSpecializationDecl()));
@@ -756,13 +736,11 @@ TEST_P(ASTMatchersTest, Matcher_ConstructorCall) {
traverse(ast_type_traits::TK_AsIs, cxxConstructExpr());
EXPECT_TRUE(
- matches("class X { public: X(); }; void x() { X x; }", Constructor));
- EXPECT_TRUE(
- matches("class X { public: X(); }; void x() { X x = X(); }",
- Constructor));
- EXPECT_TRUE(
- matches("class X { public: X(int); }; void x() { X x = 0; }",
- Constructor));
+ matches("class X { public: X(); }; void x() { X x; }", Constructor));
+ EXPECT_TRUE(matches("class X { public: X(); }; void x() { X x = X(); }",
+ Constructor));
+ EXPECT_TRUE(matches("class X { public: X(int); }; void x() { X x = 0; }",
+ Constructor));
EXPECT_TRUE(matches("class X {}; void x(int) { X x; }", Constructor));
}
@@ -779,9 +757,9 @@ TEST_P(ASTMatchersTest, Matcher_ThisExpr) {
return;
}
EXPECT_TRUE(
- matches("struct X { int a; int f () { return a; } };", cxxThisExpr()));
+ matches("struct X { int a; int f () { return a; } };", cxxThisExpr()));
EXPECT_TRUE(
- notMatches("struct X { int f () { int a; return a; } };", cxxThisExpr()));
+ notMatches("struct X { int f () { int a; return a; } };", cxxThisExpr()));
}
TEST_P(ASTMatchersTest, Matcher_BindTemporaryExpression) {
@@ -794,30 +772,27 @@ TEST_P(ASTMatchersTest, Matcher_BindTemporaryExpression) {
StringRef ClassString = "class string { public: string(); ~string(); }; ";
- EXPECT_TRUE(
- matches(ClassString +
- "string GetStringByValue();"
- "void FunctionTakesString(string s);"
- "void run() { FunctionTakesString(GetStringByValue()); }",
- TempExpression));
+ EXPECT_TRUE(matches(
+ ClassString + "string GetStringByValue();"
+ "void FunctionTakesString(string s);"
+ "void run() { FunctionTakesString(GetStringByValue()); }",
+ TempExpression));
- EXPECT_TRUE(
- notMatches(ClassString +
- "string* GetStringPointer(); "
- "void FunctionTakesStringPtr(string* s);"
- "void run() {"
- " string* s = GetStringPointer();"
- " FunctionTakesStringPtr(GetStringPointer());"
- " FunctionTakesStringPtr(s);"
- "}",
- TempExpression));
+ EXPECT_TRUE(notMatches(ClassString +
+ "string* GetStringPointer(); "
+ "void FunctionTakesStringPtr(string* s);"
+ "void run() {"
+ " string* s = GetStringPointer();"
+ " FunctionTakesStringPtr(GetStringPointer());"
+ " FunctionTakesStringPtr(s);"
+ "}",
+ TempExpression));
- EXPECT_TRUE(
- notMatches("class no_dtor {};"
- "no_dtor GetObjByValue();"
- "void ConsumeObj(no_dtor param);"
- "void run() { ConsumeObj(GetObjByValue()); }",
- TempExpression));
+ EXPECT_TRUE(notMatches("class no_dtor {};"
+ "no_dtor GetObjByValue();"
+ "void ConsumeObj(no_dtor param);"
+ "void run() { ConsumeObj(GetObjByValue()); }",
+ TempExpression));
}
TEST_P(ASTMatchersTest, MaterializeTemporaryExpr_MatchesTemporaryCXX11CXX14) {
@@ -872,10 +847,9 @@ TEST_P(ASTMatchersTest, Matcher_NewExpression) {
StatementMatcher New = cxxNewExpr();
EXPECT_TRUE(matches("class X { public: X(); }; void x() { new X; }", New));
+ EXPECT_TRUE(matches("class X { public: X(); }; void x() { new X(); }", New));
EXPECT_TRUE(
- matches("class X { public: X(); }; void x() { new X(); }", New));
- EXPECT_TRUE(
- matches("class X { public: X(int); }; void x() { new X(0); }", New));
+ matches("class X { public: X(int); }; void x() { new X(0); }", New));
EXPECT_TRUE(matches("class X {}; void x(int) { new X; }", New));
}
@@ -883,8 +857,8 @@ TEST_P(ASTMatchersTest, Matcher_DeleteExpression) {
if (!GetParam().isCXX()) {
return;
}
- EXPECT_TRUE(matches("struct A {}; void f(A* a) { delete a; }",
- cxxDeleteExpr()));
+ EXPECT_TRUE(
+ matches("struct A {}; void f(A* a) { delete a; }", cxxDeleteExpr()));
}
TEST_P(ASTMatchersTest, Matcher_NoexceptExpression) {
@@ -907,7 +881,7 @@ TEST_P(ASTMatchersTest, Matcher_DefaultArgument) {
StatementMatcher Arg = cxxDefaultArgExpr();
EXPECT_TRUE(matches("void x(int, int = 0) { int y; x(y); }", Arg));
EXPECT_TRUE(
- matches("class X { void x(int, int = 0) { int y; x(y); } };", Arg));
+ matches("class X { void x(int, int = 0) { int y; x(y); } };", Arg));
EXPECT_TRUE(notMatches("void x(int, int = 0) { int y; x(y, 0); }", Arg));
}
@@ -951,7 +925,7 @@ TEST_P(ASTMatchersTest, IntegerLiteral) {
// Non-matching cases (character literals, float and double)
EXPECT_TRUE(notMatches("int i = L'a';",
- HasIntLiteral)); // this is actually a character
+ HasIntLiteral)); // this is actually a character
// literal cast to int
EXPECT_TRUE(notMatches("int i = 'a';", HasIntLiteral));
EXPECT_TRUE(notMatches("int i = 1e10;", HasIntLiteral));
@@ -974,13 +948,13 @@ TEST_P(ASTMatchersTest, FloatLiteral) {
EXPECT_TRUE(matches("double i = 5.0;", floatLiteral(equals(5.0))));
EXPECT_TRUE(matches("double i = 5.0;", floatLiteral(equals(5.0f))));
EXPECT_TRUE(
- matches("double i = 5.0;", floatLiteral(equals(llvm::APFloat(5.0)))));
+ matches("double i = 5.0;", floatLiteral(equals(llvm::APFloat(5.0)))));
EXPECT_TRUE(notMatches("float i = 10;", HasFloatLiteral));
EXPECT_TRUE(notMatches("double i = 5.0;", floatLiteral(equals(6.0))));
EXPECT_TRUE(notMatches("double i = 5.0;", floatLiteral(equals(6.0f))));
EXPECT_TRUE(
- notMatches("double i = 5.0;", floatLiteral(equals(llvm::APFloat(6.0)))));
+ notMatches("double i = 5.0;", floatLiteral(equals(llvm::APFloat(6.0)))));
}
TEST_P(ASTMatchersTest, CXXNullPtrLiteralExpr) {
@@ -1051,9 +1025,9 @@ TEST_P(ASTMatchersTest, ParenListExpr) {
return;
}
EXPECT_TRUE(
- matches("template<typename T> class foo { void bar() { foo X(*this); } };"
+ matches("template<typename T> class foo { void bar() { foo X(*this); } };"
"template class foo<int>;",
- varDecl(hasInitializer(parenListExpr(has(unaryOperator()))))));
+ varDecl(hasInitializer(parenListExpr(has(unaryOperator()))))));
}
TEST_P(ASTMatchersTest, StmtExpr) {
@@ -1064,9 +1038,8 @@ TEST_P(ASTMatchersTest, StmtExpr) {
TEST_P(ASTMatchersTest, PredefinedExpr) {
// __func__ expands as StringLiteral("foo")
EXPECT_TRUE(matches("void foo() { __func__; }",
- predefinedExpr(
- hasType(asString("const char [4]")),
- has(stringLiteral()))));
+ predefinedExpr(hasType(asString("const char [4]")),
+ has(stringLiteral()))));
}
TEST_P(ASTMatchersTest, AsmStatement) {
@@ -1080,7 +1053,7 @@ TEST_P(ASTMatchersTest, HasCondition) {
}
StatementMatcher Condition =
- ifStmt(hasCondition(cxxBoolLiteral(equals(true))));
+ ifStmt(hasCondition(cxxBoolLiteral(equals(true))));
EXPECT_TRUE(matches("void x() { if (true) {} }", Condition));
EXPECT_TRUE(notMatches("void x() { if (false) {} }", Condition));
@@ -1096,24 +1069,24 @@ TEST_P(ASTMatchersTest, ConditionalOperator) {
return;
}
- StatementMatcher Conditional = conditionalOperator(
- hasCondition(cxxBoolLiteral(equals(true))),
- hasTrueExpression(cxxBoolLiteral(equals(false))));
+ StatementMatcher Conditional =
+ conditionalOperator(hasCondition(cxxBoolLiteral(equals(true))),
+ hasTrueExpression(cxxBoolLiteral(equals(false))));
EXPECT_TRUE(matches("void x() { true ? false : true; }", Conditional));
EXPECT_TRUE(notMatches("void x() { false ? false : true; }", Conditional));
EXPECT_TRUE(notMatches("void x() { true ? true : false; }", Conditional));
- StatementMatcher ConditionalFalse = conditionalOperator(
- hasFalseExpression(cxxBoolLiteral(equals(false))));
+ StatementMatcher ConditionalFalse =
+ conditionalOperator(hasFalseExpression(cxxBoolLiteral(equals(false))));
EXPECT_TRUE(matches("void x() { true ? true : false; }", ConditionalFalse));
EXPECT_TRUE(
- notMatches("void x() { true ? false : true; }", ConditionalFalse));
+ notMatches("void x() { true ? false : true; }", ConditionalFalse));
EXPECT_TRUE(matches("void x() { true ? true : false; }", ConditionalFalse));
EXPECT_TRUE(
- notMatches("void x() { true ? false : true; }", ConditionalFalse));
+ notMatches("void x() { true ? false : true; }", ConditionalFalse));
}
TEST_P(ASTMatchersTest, BinaryConditionalOperator) {
@@ -1132,18 +1105,17 @@ TEST_P(ASTMatchersTest, BinaryConditionalOperator) {
EXPECT_TRUE(matches("void x() { 1 ?: 0; }", AlwaysOne));
StatementMatcher FourNotFive = binaryConditionalOperator(
- hasTrueExpression(opaqueValueExpr(
- hasSourceExpression((integerLiteral(equals(4)))))),
- hasFalseExpression(integerLiteral(equals(5))));
+ hasTrueExpression(
+ opaqueValueExpr(hasSourceExpression((integerLiteral(equals(4)))))),
+ hasFalseExpression(integerLiteral(equals(5))));
EXPECT_TRUE(matches("void x() { 4 ?: 5; }", FourNotFive));
}
TEST_P(ASTMatchersTest, ArraySubscriptExpr) {
- EXPECT_TRUE(matches("int i[2]; void f() { i[1] = 1; }",
- arraySubscriptExpr()));
- EXPECT_TRUE(notMatches("int i; void f() { i = 1; }",
- arraySubscriptExpr()));
+ EXPECT_TRUE(
+ matches("int i[2]; void f() { i[1] = 1; }", arraySubscriptExpr()));
+ EXPECT_TRUE(notMatches("int i; void f() { i = 1; }", arraySubscriptExpr()));
}
TEST_P(ASTMatchersTest, ForStmt) {
@@ -1178,10 +1150,9 @@ TEST_P(ASTMatchersTest, CompoundStatement_DoesNotMatchEmptyStruct) {
}
// It's not a compound statement just because there's "{}" in the source
// text. This is an AST search, not grep.
- EXPECT_TRUE(notMatches("namespace n { struct S {}; }",
- compoundStmt()));
- EXPECT_TRUE(matches("namespace n { struct S { void f() {{}} }; }",
- compoundStmt()));
+ EXPECT_TRUE(notMatches("namespace n { struct S {}; }", compoundStmt()));
+ EXPECT_TRUE(
+ matches("namespace n { struct S { void f() {{}} }; }", compoundStmt()));
}
TEST_P(ASTMatchersTest, CastExpr_MatchesExplicitCasts) {
@@ -1242,8 +1213,8 @@ TEST_P(ASTMatchersTest, CXXReinterpretCastExpr_DoesNotMatchOtherCasts) {
EXPECT_TRUE(notMatches("void* p = static_cast<void*>(&p);",
cxxReinterpretCastExpr()));
EXPECT_TRUE(notMatches("struct B { virtual ~B() {} }; struct D : B {};"
- "B b;"
- "D* p = dynamic_cast<D*>(&b);",
+ "B b;"
+ "D* p = dynamic_cast<D*>(&b);",
cxxReinterpretCastExpr()));
}
@@ -1262,11 +1233,10 @@ TEST_P(ASTMatchersTest, CXXFunctionalCastExpr_DoesNotMatchOtherCasts) {
}
StringRef FooClass = "class Foo { public: Foo(const char*); };";
EXPECT_TRUE(
- notMatches(FooClass + "void r() { Foo f = (Foo) \"hello world\"; }",
- cxxFunctionalCastExpr()));
- EXPECT_TRUE(
- notMatches(FooClass + "void r() { Foo f = \"hello world\"; }",
- cxxFunctionalCastExpr()));
+ notMatches(FooClass + "void r() { Foo f = (Foo) \"hello world\"; }",
+ cxxFunctionalCastExpr()));
+ EXPECT_TRUE(notMatches(FooClass + "void r() { Foo f = \"hello world\"; }",
+ cxxFunctionalCastExpr()));
}
TEST_P(ASTMatchersTest, CXXDynamicCastExpr) {
@@ -1274,8 +1244,8 @@ TEST_P(ASTMatchersTest, CXXDynamicCastExpr) {
return;
}
EXPECT_TRUE(matches("struct B { virtual ~B() {} }; struct D : B {};"
- "B b;"
- "D* p = dynamic_cast<D*>(&b);",
+ "B b;"
+ "D* p = dynamic_cast<D*>(&b);",
cxxDynamicCastExpr()));
}
@@ -1283,8 +1253,7 @@ TEST_P(ASTMatchersTest, CXXStaticCastExpr_MatchesSimpleCase) {
if (!GetParam().isCXX()) {
return;
}
- EXPECT_TRUE(matches("void* p(static_cast<void*>(&p));",
- cxxStaticCastExpr()));
+ EXPECT_TRUE(matches("void* p(static_cast<void*>(&p));", cxxStaticCastExpr()));
}
TEST_P(ASTMatchersTest, CXXStaticCastExpr_DoesNotMatchOtherCasts) {
@@ -1292,13 +1261,13 @@ TEST_P(ASTMatchersTest, CXXStaticCastExpr_DoesNotMatchOtherCasts) {
return;
}
EXPECT_TRUE(notMatches("char* p = (char*)(&p);", cxxStaticCastExpr()));
- EXPECT_TRUE(notMatches("char q, *p = const_cast<char*>(&q);",
- cxxStaticCastExpr()));
+ EXPECT_TRUE(
+ notMatches("char q, *p = const_cast<char*>(&q);", cxxStaticCastExpr()));
EXPECT_TRUE(notMatches("void* p = reinterpret_cast<char*>(&p);",
cxxStaticCastExpr()));
EXPECT_TRUE(notMatches("struct B { virtual ~B() {} }; struct D : B {};"
- "B b;"
- "D* p = dynamic_cast<D*>(&b);",
+ "B b;"
+ "D* p = dynamic_cast<D*>(&b);",
cxxStaticCastExpr()));
}
@@ -1311,11 +1280,11 @@ TEST_P(ASTMatchersTest, CStyleCastExpr_DoesNotMatchOtherCasts) {
return;
}
EXPECT_TRUE(notMatches("char* p = static_cast<char*>(0);"
- "char q, *r = const_cast<char*>(&q);"
- "void* s = reinterpret_cast<char*>(&s);"
- "struct B { virtual ~B() {} }; struct D : B {};"
- "B b;"
- "D* t = dynamic_cast<D*>(&b);",
+ "char q, *r = const_cast<char*>(&q);"
+ "void* s = reinterpret_cast<char*>(&s);"
+ "struct B { virtual ~B() {} }; struct D : B {};"
+ "B b;"
+ "D* t = dynamic_cast<D*>(&b);",
cStyleCastExpr()));
}
@@ -1335,12 +1304,12 @@ TEST_P(ASTMatchersTest, ImplicitCastExpr_MatchesSimpleCase) {
}
TEST_P(ASTMatchersTest, ImplicitCastExpr_DoesNotMatchIncorrectly) {
- // This test verifies that implicitCastExpr() matches exactly when implicit casts
- // are present, and that it ignores explicit and paren casts.
+ // This test verifies that implicitCastExpr() matches exactly when implicit
+ // casts are present, and that it ignores explicit and paren casts.
// These two test cases have no casts.
- EXPECT_TRUE(notMatches("int x = 0;",
- varDecl(hasInitializer(implicitCastExpr()))));
+ EXPECT_TRUE(
+ notMatches("int x = 0;", varDecl(hasInitializer(implicitCastExpr()))));
EXPECT_TRUE(
notMatches("int x = (0);", varDecl(hasInitializer(implicitCastExpr()))));
EXPECT_TRUE(notMatches("void f() { int x = 0; double d = (double) x; }",
@@ -1393,7 +1362,7 @@ TEST_P(ASTMatchersTest, InitListExpr) {
EXPECT_TRUE(matches("struct B { int x, y; }; struct B b = { 5, 6 };",
initListExpr(hasType(recordDecl(hasName("B"))))));
EXPECT_TRUE(
- matches("int i[1] = {42, [0] = 43};", integerLiteral(equals(42))));
+ matches("int i[1] = {42, [0] = 43};", integerLiteral(equals(42))));
}
TEST_P(ASTMatchersTest, InitListExpr_CXX) {
@@ -1441,8 +1410,7 @@ TEST_P(ASTMatchersTest, UsingDecl_MatchesUsingDeclarations) {
if (!GetParam().isCXX()) {
return;
}
- EXPECT_TRUE(matches("namespace X { int x; } using X::x;",
- usingDecl()));
+ EXPECT_TRUE(matches("namespace X { int x; } using X::x;", usingDecl()));
}
TEST_P(ASTMatchersTest, UsingDecl_MatchesShadowUsingDelcarations) {
@@ -1460,7 +1428,7 @@ TEST_P(ASTMatchersTest, UsingDirectiveDecl_MatchesUsingNamespace) {
EXPECT_TRUE(matches("namespace X { int x; } using namespace X;",
usingDirectiveDecl()));
EXPECT_FALSE(
- matches("namespace X { int x; } using X::x;", usingDirectiveDecl()));
+ matches("namespace X { int x; } using X::x;", usingDirectiveDecl()));
}
TEST_P(ASTMatchersTest, WhileStmt) {
@@ -1499,11 +1467,11 @@ TEST_P(ASTMatchersTest, CxxExceptionHandling_SimpleCases) {
EXPECT_TRUE(matches("void foo() try { } catch(int X) { }", cxxCatchStmt()));
EXPECT_TRUE(matches("void foo() try { } catch(int X) { }", cxxTryStmt()));
EXPECT_TRUE(
- notMatches("void foo() try { } catch(int X) { }", cxxThrowExpr()));
- EXPECT_TRUE(matches("void foo() try { throw; } catch(int X) { }",
- cxxThrowExpr()));
- EXPECT_TRUE(matches("void foo() try { throw 5;} catch(int X) { }",
- cxxThrowExpr()));
+ notMatches("void foo() try { } catch(int X) { }", cxxThrowExpr()));
+ EXPECT_TRUE(
+ matches("void foo() try { throw; } catch(int X) { }", cxxThrowExpr()));
+ EXPECT_TRUE(
+ matches("void foo() try { throw 5;} catch(int X) { }", cxxThrowExpr()));
EXPECT_TRUE(matches("void foo() try { throw; } catch(...) { }",
cxxCatchStmt(isCatchAll())));
EXPECT_TRUE(notMatches("void foo() try { throw; } catch(int) { }",
@@ -1542,9 +1510,8 @@ TEST_P(ASTMatchersTest, QualType) {
TEST_P(ASTMatchersTest, ConstantArrayType) {
EXPECT_TRUE(matches("int a[2];", constantArrayType()));
- EXPECT_TRUE(notMatches(
- "void f() { int a[] = { 2, 3 }; int b[a[0]]; }",
- constantArrayType(hasElementType(builtinType()))));
+ EXPECT_TRUE(notMatches("void f() { int a[] = { 2, 3 }; int b[a[0]]; }",
+ constantArrayType(hasElementType(builtinType()))));
EXPECT_TRUE(matches("int a[42];", constantArrayType(hasSize(42))));
EXPECT_TRUE(matches("int b[2*21];", constantArrayType(hasSize(42))));
@@ -1555,12 +1522,12 @@ TEST_P(ASTMatchersTest, DependentSizedArrayType) {
if (!GetParam().isCXX()) {
return;
}
- EXPECT_TRUE(matches(
- "template <typename T, int Size> class array { T data[Size]; };",
- dependentSizedArrayType()));
- EXPECT_TRUE(notMatches(
- "int a[42]; int b[] = { 2, 3 }; void f() { int c[b[0]]; }",
- dependentSizedArrayType()));
+ EXPECT_TRUE(
+ matches("template <typename T, int Size> class array { T data[Size]; };",
+ dependentSizedArrayType()));
+ EXPECT_TRUE(
+ notMatches("int a[42]; int b[] = { 2, 3 }; void f() { int c[b[0]]; }",
+ dependentSizedArrayType()));
}
TEST_P(ASTMatchersTest, IncompleteArrayType) {
@@ -1575,22 +1542,21 @@ TEST_P(ASTMatchersTest, VariableArrayType) {
EXPECT_TRUE(matches("void f(int b) { int a[b]; }", variableArrayType()));
EXPECT_TRUE(notMatches("int a[] = {2, 3}; int b[42];", variableArrayType()));
- EXPECT_TRUE(matches(
- "void f(int b) { int a[b]; }",
- variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to(
- varDecl(hasName("b")))))))));
+ EXPECT_TRUE(matches("void f(int b) { int a[b]; }",
+ variableArrayType(hasSizeExpr(ignoringImpCasts(
+ declRefExpr(to(varDecl(hasName("b")))))))));
}
TEST_P(ASTMatchersTest, AtomicType) {
if (llvm::Triple(llvm::sys::getDefaultTargetTriple()).getOS() !=
- llvm::Triple::Win32) {
+ llvm::Triple::Win32) {
// FIXME: Make this work for MSVC.
EXPECT_TRUE(matches("_Atomic(int) i;", atomicType()));
- EXPECT_TRUE(matches("_Atomic(int) i;",
- atomicType(hasValueType(isInteger()))));
- EXPECT_TRUE(notMatches("_Atomic(float) f;",
- atomicType(hasValueType(isInteger()))));
+ EXPECT_TRUE(
+ matches("_Atomic(int) i;", atomicType(hasValueType(isInteger()))));
+ EXPECT_TRUE(
+ notMatches("_Atomic(float) f;", atomicType(hasValueType(isInteger()))));
}
}
@@ -1608,9 +1574,9 @@ TEST_P(ASTMatchersTest, AutoType) {
// FIXME: Matching against the type-as-written can't work here, because the
// type as written was not deduced.
- //EXPECT_TRUE(matches("auto a = 1;",
+ // EXPECT_TRUE(matches("auto a = 1;",
// autoType(hasDeducedType(isInteger()))));
- //EXPECT_TRUE(notMatches("auto b = 2.0;",
+ // EXPECT_TRUE(notMatches("auto b = 2.0;",
// autoType(hasDeducedType(isInteger()))));
}
@@ -1657,48 +1623,43 @@ TEST_P(ASTMatchersTest, FunctionProtoType_CXX) {
TEST_P(ASTMatchersTest, ParenType) {
EXPECT_TRUE(
- matches("int (*array)[4];", varDecl(hasType(pointsTo(parenType())))));
+ matches("int (*array)[4];", varDecl(hasType(pointsTo(parenType())))));
EXPECT_TRUE(notMatches("int *array[4];", varDecl(hasType(parenType()))));
EXPECT_TRUE(matches(
- "int (*ptr_to_func)(int);",
- varDecl(hasType(pointsTo(parenType(innerType(functionType())))))));
+ "int (*ptr_to_func)(int);",
+ varDecl(hasType(pointsTo(parenType(innerType(functionType())))))));
EXPECT_TRUE(notMatches(
- "int (*ptr_to_array)[4];",
- varDecl(hasType(pointsTo(parenType(innerType(functionType())))))));
+ "int (*ptr_to_array)[4];",
+ varDecl(hasType(pointsTo(parenType(innerType(functionType())))))));
}
TEST_P(ASTMatchersTest, PointerType) {
// FIXME: Reactive when these tests can be more specific (not matching
// implicit code on certain platforms), likely when we have hasDescendant for
// Types/TypeLocs.
- //EXPECT_TRUE(matchAndVerifyResultTrue(
+ // EXPECT_TRUE(matchAndVerifyResultTrue(
// "int* a;",
// pointerTypeLoc(pointeeLoc(typeLoc().bind("loc"))),
// std::make_unique<VerifyIdIsBoundTo<TypeLoc>>("loc", 1)));
- //EXPECT_TRUE(matchAndVerifyResultTrue(
+ // EXPECT_TRUE(matchAndVerifyResultTrue(
// "int* a;",
// pointerTypeLoc().bind("loc"),
// std::make_unique<VerifyIdIsBoundTo<TypeLoc>>("loc", 1)));
- EXPECT_TRUE(matches(
- "int** a;",
- loc(pointerType(pointee(qualType())))));
- EXPECT_TRUE(matches(
- "int** a;",
- loc(pointerType(pointee(pointerType())))));
- EXPECT_TRUE(matches(
- "int* b; int* * const a = &b;",
- loc(qualType(isConstQualified(), pointerType()))));
+ EXPECT_TRUE(matches("int** a;", loc(pointerType(pointee(qualType())))));
+ EXPECT_TRUE(matches("int** a;", loc(pointerType(pointee(pointerType())))));
+ EXPECT_TRUE(matches("int* b; int* * const a = &b;",
+ loc(qualType(isConstQualified(), pointerType()))));
StringRef Fragment = "int *ptr;";
- EXPECT_TRUE(notMatches(Fragment, varDecl(hasName("ptr"),
- hasType(blockPointerType()))));
- EXPECT_TRUE(notMatches(Fragment, varDecl(hasName("ptr"),
- hasType(memberPointerType()))));
- EXPECT_TRUE(matches(Fragment, varDecl(hasName("ptr"),
- hasType(pointerType()))));
- EXPECT_TRUE(notMatches(Fragment, varDecl(hasName("ptr"),
- hasType(referenceType()))));
+ EXPECT_TRUE(notMatches(Fragment,
+ varDecl(hasName("ptr"), hasType(blockPointerType()))));
+ EXPECT_TRUE(notMatches(
+ Fragment, varDecl(hasName("ptr"), hasType(memberPointerType()))));
+ EXPECT_TRUE(
+ matches(Fragment, varDecl(hasName("ptr"), hasType(pointerType()))));
+ EXPECT_TRUE(
+ notMatches(Fragment, varDecl(hasName("ptr"), hasType(referenceType()))));
}
TEST_P(ASTMatchersTest, PointerType_CXX) {
@@ -1763,28 +1724,28 @@ TEST_P(ASTMatchersTest, AutoRefTypes) {
"auto &c = a;"
"auto &&d = c;"
"auto &&e = 2;";
- EXPECT_TRUE(notMatches(Fragment, varDecl(hasName("a"),
- hasType(referenceType()))));
- EXPECT_TRUE(notMatches(Fragment, varDecl(hasName("b"),
- hasType(referenceType()))));
- EXPECT_TRUE(matches(Fragment, varDecl(hasName("c"),
- hasType(referenceType()))));
- EXPECT_TRUE(matches(Fragment, varDecl(hasName("c"),
- hasType(lValueReferenceType()))));
- EXPECT_TRUE(notMatches(Fragment, varDecl(hasName("c"),
- hasType(rValueReferenceType()))));
- EXPECT_TRUE(matches(Fragment, varDecl(hasName("d"),
- hasType(referenceType()))));
- EXPECT_TRUE(matches(Fragment, varDecl(hasName("d"),
- hasType(lValueReferenceType()))));
- EXPECT_TRUE(notMatches(Fragment, varDecl(hasName("d"),
- hasType(rValueReferenceType()))));
- EXPECT_TRUE(matches(Fragment, varDecl(hasName("e"),
- hasType(referenceType()))));
- EXPECT_TRUE(notMatches(Fragment, varDecl(hasName("e"),
- hasType(lValueReferenceType()))));
- EXPECT_TRUE(matches(Fragment, varDecl(hasName("e"),
- hasType(rValueReferenceType()))));
+ EXPECT_TRUE(
+ notMatches(Fragment, varDecl(hasName("a"), hasType(referenceType()))));
+ EXPECT_TRUE(
+ notMatches(Fragment, varDecl(hasName("b"), hasType(referenceType()))));
+ EXPECT_TRUE(
+ matches(Fragment, varDecl(hasName("c"), hasType(referenceType()))));
+ EXPECT_TRUE(
+ matches(Fragment, varDecl(hasName("c"), hasType(lValueReferenceType()))));
+ EXPECT_TRUE(notMatches(
+ Fragment, varDecl(hasName("c"), hasType(rValueReferenceType()))));
+ EXPECT_TRUE(
+ matches(Fragment, varDecl(hasName("d"), hasType(referenceType()))));
+ EXPECT_TRUE(
+ matches(Fragment, varDecl(hasName("d"), hasType(lValueReferenceType()))));
+ EXPECT_TRUE(notMatches(
+ Fragment, varDecl(hasName("d"), hasType(rValueReferenceType()))));
+ EXPECT_TRUE(
+ matches(Fragment, varDecl(hasName("e"), hasType(referenceType()))));
+ EXPECT_TRUE(notMatches(
+ Fragment, varDecl(hasName("e"), hasType(lValueReferenceType()))));
+ EXPECT_TRUE(
+ matches(Fragment, varDecl(hasName("e"), hasType(rValueReferenceType()))));
}
TEST_P(ASTMatchersTest, EnumType) {
@@ -1796,34 +1757,29 @@ TEST_P(ASTMatchersTest, EnumType_CXX) {
if (!GetParam().isCXX()) {
return;
}
- EXPECT_TRUE(matches("enum Color { Green }; Color color;",
- loc(enumType())));
+ EXPECT_TRUE(matches("enum Color { Green }; Color color;", loc(enumType())));
}
TEST_P(ASTMatchersTest, EnumType_CXX11) {
if (!GetParam().isCXX11OrLater()) {
return;
}
- EXPECT_TRUE(matches("enum class Color { Green }; Color color;",
- loc(enumType())));
+ EXPECT_TRUE(
+ matches("enum class Color { Green }; Color color;", loc(enumType())));
}
TEST_P(ASTMatchersTest, PointerType_MatchesPointersToConstTypes) {
- EXPECT_TRUE(matches("int b; int * const a = &b;",
- loc(pointerType())));
- EXPECT_TRUE(matches("int b; int * const a = &b;",
- loc(pointerType())));
- EXPECT_TRUE(matches(
- "int b; const int * a = &b;",
- loc(pointerType(pointee(builtinType())))));
- EXPECT_TRUE(matches(
- "int b; const int * a = &b;",
- pointerType(pointee(builtinType()))));
+ EXPECT_TRUE(matches("int b; int * const a = &b;", loc(pointerType())));
+ EXPECT_TRUE(matches("int b; int * const a = &b;", loc(pointerType())));
+ EXPECT_TRUE(matches("int b; const int * a = &b;",
+ loc(pointerType(pointee(builtinType())))));
+ EXPECT_TRUE(matches("int b; const int * a = &b;",
+ pointerType(pointee(builtinType()))));
}
TEST_P(ASTMatchersTest, TypedefType) {
- EXPECT_TRUE(matches("typedef int X; X a;", varDecl(hasName("a"),
- hasType(typedefType()))));
+ EXPECT_TRUE(matches("typedef int X; X a;",
+ varDecl(hasName("a"), hasType(typedefType()))));
}
TEST_P(ASTMatchersTest, TemplateSpecializationType) {
@@ -1864,13 +1820,13 @@ TEST_P(ASTMatchersTest, ElaboratedType) {
// FIXME: Add a test for `elaboratedType()` that does not depend on C++.
return;
}
- EXPECT_TRUE(matches(
- "namespace N {"
- " namespace M {"
- " class D {};"
- " }"
- "}"
- "N::M::D d;", elaboratedType()));
+ EXPECT_TRUE(matches("namespace N {"
+ " namespace M {"
+ " class D {};"
+ " }"
+ "}"
+ "N::M::D d;",
+ elaboratedType()));
EXPECT_TRUE(matches("class C {} c;", elaboratedType()));
EXPECT_TRUE(notMatches("class C {}; C c;", elaboratedType()));
}
@@ -1885,30 +1841,29 @@ TEST_P(ASTMatchersTest, SubstTemplateTypeParmType) {
"}"
"int i = F<int>();";
EXPECT_FALSE(matches(code, binaryOperator(hasLHS(
- expr(hasType(substTemplateTypeParmType()))))));
+ expr(hasType(substTemplateTypeParmType()))))));
EXPECT_TRUE(matches(code, binaryOperator(hasRHS(
- expr(hasType(substTemplateTypeParmType()))))));
+ expr(hasType(substTemplateTypeParmType()))))));
}
TEST_P(ASTMatchersTest, NestedNameSpecifier) {
if (!GetParam().isCXX()) {
return;
}
- EXPECT_TRUE(matches("namespace ns { struct A {}; } ns::A a;",
- nestedNameSpecifier()));
+ EXPECT_TRUE(
+ matches("namespace ns { struct A {}; } ns::A a;", nestedNameSpecifier()));
EXPECT_TRUE(matches("template <typename T> class A { typename T::B b; };",
nestedNameSpecifier()));
- EXPECT_TRUE(matches("struct A { void f(); }; void A::f() {}",
- nestedNameSpecifier()));
+ EXPECT_TRUE(
+ matches("struct A { void f(); }; void A::f() {}", nestedNameSpecifier()));
EXPECT_TRUE(matches("namespace a { namespace b {} } namespace ab = a::b;",
nestedNameSpecifier()));
- EXPECT_TRUE(matches(
- "struct A { static void f() {} }; void g() { A::f(); }",
- nestedNameSpecifier()));
- EXPECT_TRUE(notMatches(
- "struct A { static void f() {} }; void g(A* a) { a->f(); }",
- nestedNameSpecifier()));
+ EXPECT_TRUE(matches("struct A { static void f() {} }; void g() { A::f(); }",
+ nestedNameSpecifier()));
+ EXPECT_TRUE(
+ notMatches("struct A { static void f() {} }; void g(A* a) { a->f(); }",
+ nestedNameSpecifier()));
}
TEST_P(ASTMatchersTest, NullStmt) {
@@ -1929,10 +1884,10 @@ TEST_P(ASTMatchersTest, NestedNameSpecifier_MatchesTypes) {
return;
}
NestedNameSpecifierMatcher Matcher = nestedNameSpecifier(
- specifiesType(hasDeclaration(recordDecl(hasName("A")))));
+ specifiesType(hasDeclaration(recordDecl(hasName("A")))));
EXPECT_TRUE(matches("struct A { struct B {}; }; A::B b;", Matcher));
- EXPECT_TRUE(matches("struct A { struct B { struct C {}; }; }; A::B::C c;",
- Matcher));
+ EXPECT_TRUE(
+ matches("struct A { struct B { struct C {}; }; }; A::B::C c;", Matcher));
EXPECT_TRUE(notMatches("namespace A { struct B {}; } A::B b;", Matcher));
}
@@ -1940,8 +1895,8 @@ TEST_P(ASTMatchersTest, NestedNameSpecifier_MatchesNamespaceDecls) {
if (!GetParam().isCXX()) {
return;
}
- NestedNameSpecifierMatcher Matcher = nestedNameSpecifier(
- specifiesNamespace(hasName("ns")));
+ NestedNameSpecifierMatcher Matcher =
+ nestedNameSpecifier(specifiesNamespace(hasName("ns")));
EXPECT_TRUE(matches("namespace ns { struct A {}; } ns::A a;", Matcher));
EXPECT_TRUE(notMatches("namespace xx { struct A {}; } xx::A a;", Matcher));
EXPECT_TRUE(notMatches("struct ns { struct A {}; }; ns::A a;", Matcher));
@@ -1953,16 +1908,15 @@ TEST_P(ASTMatchersTest,
return;
}
EXPECT_TRUE(matches(
- "struct A { struct B { struct C {}; }; }; A::B::C c;",
- nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A"))))));
- EXPECT_TRUE(matches(
- "struct A { struct B { struct C {}; }; }; A::B::C c;",
- nestedNameSpecifierLoc(hasPrefix(
- specifiesTypeLoc(loc(qualType(asString("struct A"))))))));
+ "struct A { struct B { struct C {}; }; }; A::B::C c;",
+ nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A"))))));
+ EXPECT_TRUE(matches("struct A { struct B { struct C {}; }; }; A::B::C c;",
+ nestedNameSpecifierLoc(hasPrefix(specifiesTypeLoc(
+ loc(qualType(asString("struct A"))))))));
EXPECT_TRUE(matches(
- "namespace N { struct A { struct B { struct C {}; }; }; } N::A::B::C c;",
- nestedNameSpecifierLoc(hasPrefix(
- specifiesTypeLoc(loc(qualType(asString("struct N::A"))))))));
+ "namespace N { struct A { struct B { struct C {}; }; }; } N::A::B::C c;",
+ nestedNameSpecifierLoc(hasPrefix(
+ specifiesTypeLoc(loc(qualType(asString("struct N::A"))))))));
}
template <typename T>
@@ -1980,18 +1934,18 @@ class VerifyAncestorHasChildIsEqual : public BoundNodesCallback {
// to equalsNode.
const T *TypedNode = cast<T>(Node);
return selectFirst<T>(
- "", match(stmt(hasParent(
- stmt(has(stmt(equalsNode(TypedNode)))).bind(""))),
- *Node, Context)) != nullptr;
+ "", match(stmt(hasParent(
+ stmt(has(stmt(equalsNode(TypedNode)))).bind(""))),
+ *Node, Context)) != nullptr;
}
bool verify(const BoundNodes &Nodes, ASTContext &Context, const Decl *Node) {
// Use the original typed pointer to verify we can pass pointers to subtypes
// to equalsNode.
const T *TypedNode = cast<T>(Node);
return selectFirst<T>(
- "", match(decl(hasParent(
- decl(has(decl(equalsNode(TypedNode)))).bind(""))),
- *Node, Context)) != nullptr;
+ "", match(decl(hasParent(
+ decl(has(decl(equalsNode(TypedNode)))).bind(""))),
+ *Node, Context)) != nullptr;
}
bool verify(const BoundNodes &Nodes, ASTContext &Context, const Type *Node) {
// Use the original typed pointer to verify we can pass pointers to subtypes
@@ -1999,9 +1953,9 @@ class VerifyAncestorHasChildIsEqual : public BoundNodesCallback {
const T *TypedNode = cast<T>(Node);
const auto *Dec = Nodes.getNodeAs<FieldDecl>("decl");
return selectFirst<T>(
- "", match(fieldDecl(hasParent(decl(has(fieldDecl(
- hasType(type(equalsNode(TypedNode)).bind(""))))))),
- *Dec, Context)) != nullptr;
+ "", match(fieldDecl(hasParent(decl(has(fieldDecl(
+ hasType(type(equalsNode(TypedNode)).bind(""))))))),
+ *Dec, Context)) != nullptr;
}
};
@@ -2100,43 +2054,31 @@ TEST(ASTMatchersTestObjC, ObjCMessageExpr) {
" Str *up = [text uppercaseString];"
"} "
"@end ";
- EXPECT_TRUE(matchesObjC(
- Objc1String,
- objcMessageExpr(anything())));
+ EXPECT_TRUE(matchesObjC(Objc1String, objcMessageExpr(anything())));
EXPECT_TRUE(matchesObjC(Objc1String,
- objcMessageExpr(hasAnySelector({
- "contents", "meth:"}))
+ objcMessageExpr(hasAnySelector({"contents", "meth:"}))
- ));
- EXPECT_TRUE(matchesObjC(
- Objc1String,
- objcMessageExpr(hasSelector("contents"))));
- EXPECT_TRUE(matchesObjC(
- Objc1String,
- objcMessageExpr(hasAnySelector("contents", "contentsA"))));
- EXPECT_FALSE(matchesObjC(
- Objc1String,
- objcMessageExpr(hasAnySelector("contentsB", "contentsC"))));
+ ));
+ EXPECT_TRUE(
+ matchesObjC(Objc1String, objcMessageExpr(hasSelector("contents"))));
EXPECT_TRUE(matchesObjC(
- Objc1String,
- objcMessageExpr(matchesSelector("cont*"))));
+ Objc1String, objcMessageExpr(hasAnySelector("contents", "contentsA"))));
EXPECT_FALSE(matchesObjC(
- Objc1String,
- objcMessageExpr(matchesSelector("?cont*"))));
- EXPECT_TRUE(notMatchesObjC(
- Objc1String,
- objcMessageExpr(hasSelector("contents"), hasNullSelector())));
- EXPECT_TRUE(matchesObjC(
- Objc1String,
- objcMessageExpr(hasSelector("contents"), hasUnarySelector())));
- EXPECT_TRUE(matchesObjC(
- Objc1String,
- objcMessageExpr(hasSelector("contents"), numSelectorArgs(0))));
- EXPECT_TRUE(matchesObjC(
- Objc1String,
- objcMessageExpr(matchesSelector("uppercase*"),
- argumentCountIs(0)
- )));
+ Objc1String, objcMessageExpr(hasAnySelector("contentsB", "contentsC"))));
+ EXPECT_TRUE(
+ matchesObjC(Objc1String, objcMessageExpr(matchesSelector("cont*"))));
+ EXPECT_FALSE(
+ matchesObjC(Objc1String, objcMessageExpr(matchesSelector("?cont*"))));
+ EXPECT_TRUE(
+ notMatchesObjC(Objc1String, objcMessageExpr(hasSelector("contents"),
+ hasNullSelector())));
+ EXPECT_TRUE(matchesObjC(Objc1String, objcMessageExpr(hasSelector("contents"),
+ hasUnarySelector())));
+ EXPECT_TRUE(matchesObjC(Objc1String, objcMessageExpr(hasSelector("contents"),
+ numSelectorArgs(0))));
+ EXPECT_TRUE(
+ matchesObjC(Objc1String, objcMessageExpr(matchesSelector("uppercase*"),
+ argumentCountIs(0))));
}
TEST(ASTMatchersTestObjC, ObjCDecls) {
@@ -2157,33 +2099,17 @@ TEST(ASTMatchersTestObjC, ObjCDecls) {
"- (void)abc_doThing {} "
"@end ";
- EXPECT_TRUE(matchesObjC(
- ObjCString,
- objcProtocolDecl(hasName("Proto"))));
- EXPECT_TRUE(matchesObjC(
- ObjCString,
- objcImplementationDecl(hasName("Thing"))));
- EXPECT_TRUE(matchesObjC(
- ObjCString,
- objcCategoryDecl(hasName("ABC"))));
- EXPECT_TRUE(matchesObjC(
- ObjCString,
- objcCategoryImplDecl(hasName("ABC"))));
- EXPECT_TRUE(matchesObjC(
- ObjCString,
- objcMethodDecl(hasName("protoDidThing"))));
- EXPECT_TRUE(matchesObjC(
- ObjCString,
- objcMethodDecl(hasName("abc_doThing"))));
- EXPECT_TRUE(matchesObjC(
- ObjCString,
- objcMethodDecl(hasName("anything"))));
- EXPECT_TRUE(matchesObjC(
- ObjCString,
- objcIvarDecl(hasName("_ivar"))));
- EXPECT_TRUE(matchesObjC(
- ObjCString,
- objcPropertyDecl(hasName("enabled"))));
+ EXPECT_TRUE(matchesObjC(ObjCString, objcProtocolDecl(hasName("Proto"))));
+ EXPECT_TRUE(
+ matchesObjC(ObjCString, objcImplementationDecl(hasName("Thing"))));
+ EXPECT_TRUE(matchesObjC(ObjCString, objcCategoryDecl(hasName("ABC"))));
+ EXPECT_TRUE(matchesObjC(ObjCString, objcCategoryImplDecl(hasName("ABC"))));
+ EXPECT_TRUE(
+ matchesObjC(ObjCString, objcMethodDecl(hasName("protoDidThing"))));
+ EXPECT_TRUE(matchesObjC(ObjCString, objcMethodDecl(hasName("abc_doThing"))));
+ EXPECT_TRUE(matchesObjC(ObjCString, objcMethodDecl(hasName("anything"))));
+ EXPECT_TRUE(matchesObjC(ObjCString, objcIvarDecl(hasName("_ivar"))));
+ EXPECT_TRUE(matchesObjC(ObjCString, objcPropertyDecl(hasName("enabled"))));
}
TEST(ASTMatchersTestObjC, ObjCExceptionStmts) {
@@ -2194,18 +2120,10 @@ TEST(ASTMatchersTestObjC, ObjCExceptionStmts) {
" } @finally {}"
"}";
- EXPECT_TRUE(matchesObjC(
- ObjCString,
- objcTryStmt()));
- EXPECT_TRUE(matchesObjC(
- ObjCString,
- objcThrowStmt()));
- EXPECT_TRUE(matchesObjC(
- ObjCString,
- objcCatchStmt()));
- EXPECT_TRUE(matchesObjC(
- ObjCString,
- objcFinallyStmt()));
+ EXPECT_TRUE(matchesObjC(ObjCString, objcTryStmt()));
+ EXPECT_TRUE(matchesObjC(ObjCString, objcThrowStmt()));
+ EXPECT_TRUE(matchesObjC(ObjCString, objcCatchStmt()));
+ EXPECT_TRUE(matchesObjC(ObjCString, objcFinallyStmt()));
}
TEST(ASTMatchersTestObjC, ObjCAutoreleasePoolStmt) {
@@ -2274,11 +2192,18 @@ void x() {
EXPECT_TRUE(matchesWithOpenMP(Source3, Matcher));
StringRef Source4 = R"(
+void x() {
+#pragma omp parallel default(firstprivate)
+;
+})";
+ EXPECT_TRUE(matchesWithOpenMP51(Source4, Matcher));
+
+ StringRef Source5 = R"(
void x(int x) {
#pragma omp parallel num_threads(x)
;
})";
- EXPECT_TRUE(notMatchesWithOpenMP(Source4, Matcher));
+ EXPECT_TRUE(notMatchesWithOpenMP(Source5, Matcher));
}
TEST(ASTMatchersTest, Finder_DynamicOnlyAcceptsSomeMatchers) {
diff --git a/clang/unittests/ASTMatchers/ASTMatchersTest.h b/clang/unittests/ASTMatchers/ASTMatchersTest.h
index 8669ebd552c8..bde6297f82dd 100644
--- a/clang/unittests/ASTMatchers/ASTMatchersTest.h
+++ b/clang/unittests/ASTMatchers/ASTMatchersTest.h
@@ -20,10 +20,10 @@ namespace clang {
namespace ast_matchers {
using clang::tooling::buildASTFromCodeWithArgs;
+using clang::tooling::FileContentMappings;
+using clang::tooling::FrontendActionFactory;
using clang::tooling::newFrontendActionFactory;
using clang::tooling::runToolOnCodeWithArgs;
-using clang::tooling::FrontendActionFactory;
-using clang::tooling::FileContentMappings;
class BoundNodesCallback {
public:
@@ -38,7 +38,8 @@ class BoundNodesCallback {
// If 'FindResultVerifier' is NULL, sets *Verified to true when Run is called.
class VerifyMatch : public MatchFinder::MatchCallback {
public:
- VerifyMatch(std::unique_ptr<BoundNodesCallback> FindResultVerifier, bool *Verified)
+ VerifyMatch(std::unique_ptr<BoundNodesCallback> FindResultVerifier,
+ bool *Verified)
: Verified(Verified), FindResultReviewer(std::move(FindResultVerifier)) {}
void run(const MatchFinder::MatchResult &Result) override {
@@ -124,17 +125,16 @@ testing::AssertionResult matchesConditionally(
return testing::AssertionFailure() << "Parsing error in \"" << Code << "\"";
}
if (Found != DynamicFound) {
- return testing::AssertionFailure() << "Dynamic match result ("
- << DynamicFound
- << ") does not match static result ("
- << Found << ")";
+ return testing::AssertionFailure()
+ << "Dynamic match result (" << DynamicFound
+ << ") does not match static result (" << Found << ")";
}
if (!Found && ExpectMatch) {
return testing::AssertionFailure()
- << "Could not find match in \"" << Code << "\"";
+ << "Could not find match in \"" << Code << "\"";
} else if (Found && !ExpectMatch) {
return testing::AssertionFailure()
- << "Found unexpected match in \"" << Code << "\"";
+ << "Found unexpected match in \"" << Code << "\"";
}
return testing::AssertionSuccess();
}
@@ -216,7 +216,8 @@ matchesConditionallyWithCuda(const Twine &Code, const T &AMatcher,
" size_t sharedSize = 0,"
" cudaStream_t stream = 0);"
"extern \"C\" unsigned __cudaPushCallConfiguration("
- " dim3 gridDim, dim3 blockDim, size_t sharedMem = 0, void *stream = 0);";
+ " dim3 gridDim, dim3 blockDim, size_t sharedMem = 0, void *stream = "
+ "0);";
bool Found = false, DynamicFound = false;
MatchFinder Finder;
@@ -233,22 +234,20 @@ matchesConditionallyWithCuda(const Twine &Code, const T &AMatcher,
std::vector<std::string> Args = {
"-xcuda", "-fno-ms-extensions", "--cuda-host-only", "-nocudainc",
"-target", "x86_64-unknown-unknown", std::string(CompileArg)};
- if (!runToolOnCodeWithArgs(Factory->create(),
- CudaHeader + Code, Args)) {
+ if (!runToolOnCodeWithArgs(Factory->create(), CudaHeader + Code, Args)) {
return testing::AssertionFailure() << "Parsing error in \"" << Code << "\"";
}
if (Found != DynamicFound) {
- return testing::AssertionFailure() << "Dynamic match result ("
- << DynamicFound
- << ") does not match static result ("
- << Found << ")";
+ return testing::AssertionFailure()
+ << "Dynamic match result (" << DynamicFound
+ << ") does not match static result (" << Found << ")";
}
if (!Found && ExpectMatch) {
return testing::AssertionFailure()
- << "Could not find match in \"" << Code << "\"";
+ << "Could not find match in \"" << Code << "\"";
} else if (Found && !ExpectMatch) {
return testing::AssertionFailure()
- << "Found unexpected match in \"" << Code << "\"";
+ << "Found unexpected match in \"" << Code << "\"";
}
return testing::AssertionSuccess();
}
@@ -276,13 +275,28 @@ testing::AssertionResult notMatchesWithOpenMP(const Twine &Code,
return matchesConditionally(Code, AMatcher, false, {"-fopenmp=libomp"});
}
+template <typename T>
+testing::AssertionResult matchesWithOpenMP51(const Twine &Code,
+ const T &AMatcher) {
+ return matchesConditionally(Code, AMatcher, true,
+ {"-fopenmp=libomp", "-fopenmp-version=51"});
+}
+
+template <typename T>
+testing::AssertionResult notMatchesWithOpenMP51(const Twine &Code,
+ const T &AMatcher) {
+ return matchesConditionally(Code, AMatcher, false,
+ {"-fopenmp=libomp", "-fopenmp-version=51"});
+}
+
template <typename T>
testing::AssertionResult matchAndVerifyResultConditionally(
const Twine &Code, const T &AMatcher,
std::unique_ptr<BoundNodesCallback> FindResultVerifier, bool ExpectResult) {
bool VerifiedResult = false;
MatchFinder Finder;
- VerifyMatch VerifyVerifiedResult(std::move(FindResultVerifier), &VerifiedResult);
+ VerifyMatch VerifyVerifiedResult(std::move(FindResultVerifier),
+ &VerifiedResult);
Finder.addMatcher(AMatcher, &VerifyVerifiedResult);
std::unique_ptr<FrontendActionFactory> Factory(
newFrontendActionFactory(&Finder));
@@ -296,10 +310,10 @@ testing::AssertionResult matchAndVerifyResultConditionally(
}
if (!VerifiedResult && ExpectResult) {
return testing::AssertionFailure()
- << "Could not verify result in \"" << Code << "\"";
+ << "Could not verify result in \"" << Code << "\"";
} else if (VerifiedResult && !ExpectResult) {
return testing::AssertionFailure()
- << "Verified unexpected result in \"" << Code << "\"";
+ << "Verified unexpected result in \"" << Code << "\"";
}
VerifiedResult = false;
@@ -307,15 +321,15 @@ testing::AssertionResult matchAndVerifyResultConditionally(
std::unique_ptr<ASTUnit> AST(
buildASTFromCodeWithArgs(Code.toStringRef(Buffer), Args));
if (!AST.get())
- return testing::AssertionFailure() << "Parsing error in \"" << Code
- << "\" while building AST";
+ return testing::AssertionFailure()
+ << "Parsing error in \"" << Code << "\" while building AST";
Finder.matchAST(AST->getASTContext());
if (!VerifiedResult && ExpectResult) {
return testing::AssertionFailure()
- << "Could not verify result in \"" << Code << "\" with AST";
+ << "Could not verify result in \"" << Code << "\" with AST";
} else if (VerifiedResult && !ExpectResult) {
return testing::AssertionFailure()
- << "Verified unexpected result in \"" << Code << "\" with AST";
+ << "Verified unexpected result in \"" << Code << "\" with AST";
}
return testing::AssertionSuccess();
@@ -327,8 +341,8 @@ template <typename T>
testing::AssertionResult matchAndVerifyResultTrue(
const Twine &Code, const T &AMatcher,
std::unique_ptr<BoundNodesCallback> FindResultVerifier) {
- return matchAndVerifyResultConditionally(
- Code, AMatcher, std::move(FindResultVerifier), true);
+ return matchAndVerifyResultConditionally(Code, AMatcher,
+ std::move(FindResultVerifier), true);
}
template <typename T>
@@ -342,8 +356,7 @@ testing::AssertionResult matchAndVerifyResultFalse(
// Implements a run method that returns whether BoundNodes contains a
// Decl bound to Id that can be dynamically cast to T.
// Optionally checks that the check succeeded a specific number of times.
-template <typename T>
-class VerifyIdIsBoundTo : public BoundNodesCallback {
+template <typename T> class VerifyIdIsBoundTo : public BoundNodesCallback {
public:
// Create an object that checks that a node of type \c T was bound to \c Id.
// Does not check for a certain number of matches.
@@ -386,7 +399,7 @@ class VerifyIdIsBoundTo : public BoundNodesCallback {
if (const NamedDecl *Named = Nodes->getNodeAs<NamedDecl>(Id)) {
Name = Named->getNameAsString();
} else if (const NestedNameSpecifier *NNS =
- Nodes->getNodeAs<NestedNameSpecifier>(Id)) {
+ Nodes->getNodeAs<NestedNameSpecifier>(Id)) {
llvm::raw_string_ostream OS(Name);
NNS->print(OS, PrintingPolicy(LangOptions()));
}
@@ -398,7 +411,7 @@ class VerifyIdIsBoundTo : public BoundNodesCallback {
return true;
}
EXPECT_TRUE(M.count(Id) == 0 ||
- M.find(Id)->second.template get<T>() == nullptr);
+ M.find(Id)->second.template get<T>() == nullptr);
return false;
}
@@ -437,4 +450,4 @@ class ASTMatchersTest : public ::testing::Test,
} // namespace ast_matchers
} // namespace clang
-#endif // LLVM_CLANG_UNITTESTS_AST_MATCHERS_AST_MATCHERS_TEST_H
+#endif // LLVM_CLANG_UNITTESTS_AST_MATCHERS_AST_MATCHERS_TEST_H
diff --git a/llvm/include/llvm/Frontend/OpenMP/OMPKinds.def b/llvm/include/llvm/Frontend/OpenMP/OMPKinds.def
index bf799a781ae1..93ea63c1c2e6 100644
--- a/llvm/include/llvm/Frontend/OpenMP/OMPKinds.def
+++ b/llvm/include/llvm/Frontend/OpenMP/OMPKinds.def
@@ -982,6 +982,7 @@ __OMP_CANCEL_KIND(taskgroup, 4)
__OMP_DEFAULT_KIND(none)
__OMP_DEFAULT_KIND(shared)
+__OMP_DEFAULT_KIND(firstprivate)
__OMP_DEFAULT_KIND(unknown)
#undef __OMP_DEFAULT_KIND
More information about the cfe-commits
mailing list