diff --git a/lib/Sema/SemaOpenMP.cpp b/lib/Sema/SemaOpenMP.cpp index 3c8554893b431e87c911909fbfc2f3be0a0c9aaa..45085f1dc4968422e04da278594248f818413003 100644 --- a/lib/Sema/SemaOpenMP.cpp +++ b/lib/Sema/SemaOpenMP.cpp @@ -9133,7 +9133,7 @@ OMPClause *Sema::ActOnOpenMPReductionClause( // for all threads of the team. if (!ASE && !OASE && VD) { VarDecl *VDDef = VD->getDefinition(); - if (VD->getType()->isReferenceType() && VDDef) { + if (VD->getType()->isReferenceType() && VDDef && VDDef->hasInit()) { DSARefChecker Check(DSAStack); if (Check.Visit(VDDef->getInit())) { Diag(ELoc, diag::err_omp_reduction_ref_type_arg) << ERange; diff --git a/test/OpenMP/distribute_parallel_for_reduction_messages.cpp b/test/OpenMP/distribute_parallel_for_reduction_messages.cpp index f23a25e28c0293fbd5d37abc1150aad8e0ca0117..95654a9e5018290b03e43981a4f42497d7c44630 100644 --- a/test/OpenMP/distribute_parallel_for_reduction_messages.cpp +++ b/test/OpenMP/distribute_parallel_for_reduction_messages.cpp @@ -9,6 +9,14 @@ bool foobool(int argc) { return argc; } +void foobar(int &ref) { +#pragma omp target +#pragma omp teams +#pragma omp distribute parallel for reduction(+:ref) + for (int i = 0; i < 10; ++i) + foo(); +} + struct S1; // expected-note {{declared here}} expected-note 4 {{forward declaration of 'S1'}} extern S1 a; class S2 { diff --git a/test/OpenMP/distribute_parallel_for_simd_reduction_messages.cpp b/test/OpenMP/distribute_parallel_for_simd_reduction_messages.cpp index 7b7e9ea53ccb437881d106e04a441c019474bb22..6ad41d72bf78bacfa3a233b68a87c73a8b9c1bbd 100644 --- a/test/OpenMP/distribute_parallel_for_simd_reduction_messages.cpp +++ b/test/OpenMP/distribute_parallel_for_simd_reduction_messages.cpp @@ -9,6 +9,14 @@ bool foobool(int argc) { return argc; } +void foobar(int &ref) { +#pragma omp target +#pragma omp teams +#pragma omp distribute parallel for simd reduction(+:ref) + for (int i = 0; i < 10; ++i) + foo(); +} + struct S1; // expected-note {{declared here}} expected-note 4 {{forward declaration of 'S1'}} extern S1 a; class S2 { diff --git a/test/OpenMP/distribute_simd_reduction_messages.cpp b/test/OpenMP/distribute_simd_reduction_messages.cpp index e03b852928082c88ee257f827aa749406ec1327b..fca3e85a7104d9a5cdb3f60f3b780d1a80fc6d11 100644 --- a/test/OpenMP/distribute_simd_reduction_messages.cpp +++ b/test/OpenMP/distribute_simd_reduction_messages.cpp @@ -9,6 +9,14 @@ bool foobool(int argc) { return argc; } +void foobar(int &ref) { +#pragma omp target +#pragma omp teams +#pragma omp distribute simd reduction(+:ref) + for (int i = 0; i < 10; ++i) + foo(); +} + struct S1; // expected-note {{declared here}} expected-note 4 {{forward declaration of 'S1'}} extern S1 a; class S2 { diff --git a/test/OpenMP/for_reduction_messages.cpp b/test/OpenMP/for_reduction_messages.cpp index 45a4681440fc2d2f2d7b775ed241046b2460ead7..bb70ecc2b23e83f0a9835abe8cbd9951f8fa5a41 100644 --- a/test/OpenMP/for_reduction_messages.cpp +++ b/test/OpenMP/for_reduction_messages.cpp @@ -9,6 +9,13 @@ bool foobool(int argc) { return argc; } +void foobar(int &ref) { +#pragma omp parallel +#pragma omp for reduction(+:ref) + for (int i = 0; i < 10; ++i) + foo(); +} + struct S1; // expected-note {{declared here}} expected-note 4 {{forward declaration of 'S1'}} extern S1 a; class S2 { diff --git a/test/OpenMP/for_simd_reduction_messages.cpp b/test/OpenMP/for_simd_reduction_messages.cpp index 2935cec602dd23a81ffe86dc449d1f354dc98cc5..485070e758ae33a57797fe9560f7c1b4d7148def 100644 --- a/test/OpenMP/for_simd_reduction_messages.cpp +++ b/test/OpenMP/for_simd_reduction_messages.cpp @@ -9,6 +9,13 @@ bool foobool(int argc) { return argc; } +void foobar(int &ref) { +#pragma omp parallel +#pragma omp for simd reduction(+:ref) + for (int i = 0; i < 10; ++i) + foo(); +} + struct S1; // expected-note {{declared here}} expected-note 4 {{forward declaration of 'S1'}} extern S1 a; class S2 { diff --git a/test/OpenMP/parallel_for_reduction_messages.cpp b/test/OpenMP/parallel_for_reduction_messages.cpp index 4d5a143bae3a3735a9005a86e80ab9aed63637a5..57ab1fac9c11fa3ad0e005f93cfafedf1cd4447b 100644 --- a/test/OpenMP/parallel_for_reduction_messages.cpp +++ b/test/OpenMP/parallel_for_reduction_messages.cpp @@ -9,6 +9,12 @@ bool foobool(int argc) { return argc; } +void foobar(int &ref) { +#pragma omp parallel for reduction(+:ref) + for (int i = 0; i < 10; ++i) + foo(); +} + struct S1; // expected-note {{declared here}} expected-note 4 {{forward declaration of 'S1'}} extern S1 a; class S2 { diff --git a/test/OpenMP/parallel_for_simd_reduction_messages.cpp b/test/OpenMP/parallel_for_simd_reduction_messages.cpp index afb0b367c419352626d604a7f23dfe7ffebff69f..60a947dd5f8442582153a88c2aea8695c829560c 100644 --- a/test/OpenMP/parallel_for_simd_reduction_messages.cpp +++ b/test/OpenMP/parallel_for_simd_reduction_messages.cpp @@ -9,6 +9,12 @@ bool foobool(int argc) { return argc; } +void foobar(int &ref) { +#pragma omp parallel for simd reduction(+:ref) + for (int i = 0; i < 10; ++i) + foo(); +} + struct S1; // expected-note {{declared here}} expected-note 4 {{forward declaration of 'S1'}} extern S1 a; class S2 { diff --git a/test/OpenMP/parallel_reduction_messages.cpp b/test/OpenMP/parallel_reduction_messages.cpp index af1f5ed7bc0d9e709b4f1d2340baff636f7281d6..947353fc2dd4a7305ce96235cb73a64a167f3146 100644 --- a/test/OpenMP/parallel_reduction_messages.cpp +++ b/test/OpenMP/parallel_reduction_messages.cpp @@ -9,6 +9,11 @@ bool foobool(int argc) { return argc; } +void foobar(int &ref) { +#pragma omp parallel reduction(+:ref) + foo(); +} + struct S1; // expected-note {{declared here}} expected-note 4 {{forward declaration of 'S1'}} extern S1 a; class S2 { diff --git a/test/OpenMP/parallel_sections_reduction_messages.cpp b/test/OpenMP/parallel_sections_reduction_messages.cpp index 52d4cb9cdcb653b6cbdccf4839c34e19d283ce85..05cc7f0f6c5faf702ac2231152790e4bf7b86be8 100644 --- a/test/OpenMP/parallel_sections_reduction_messages.cpp +++ b/test/OpenMP/parallel_sections_reduction_messages.cpp @@ -9,6 +9,13 @@ bool foobool(int argc) { return argc; } +void foobar(int &ref) { +#pragma omp parallel sections reduction(+:ref) + { + foo(); + } +} + struct S1; // expected-note {{declared here}} expected-note 4 {{forward declaration of 'S1'}} extern S1 a; class S2 { diff --git a/test/OpenMP/sections_reduction_messages.cpp b/test/OpenMP/sections_reduction_messages.cpp index 134bf619c911392be8f1395e0670233744bdddc9..f13c5b3f2862292c01f43fcd1bbcff20ab89d39b 100644 --- a/test/OpenMP/sections_reduction_messages.cpp +++ b/test/OpenMP/sections_reduction_messages.cpp @@ -9,6 +9,14 @@ bool foobool(int argc) { return argc; } +void foobar(int &ref) { +#pragma omp parallel +#pragma omp sections reduction(+:ref) + { + foo(); + } +} + struct S1; // expected-note {{declared here}} expected-note 4 {{forward declaration of 'S1'}} extern S1 a; class S2 { diff --git a/test/OpenMP/simd_reduction_messages.cpp b/test/OpenMP/simd_reduction_messages.cpp index c47d53eb9185e96ce42c3049afd8eb71fd26ca40..1e1a233ec49971a2e4ac3f38072896c46bc26ef3 100644 --- a/test/OpenMP/simd_reduction_messages.cpp +++ b/test/OpenMP/simd_reduction_messages.cpp @@ -9,6 +9,12 @@ bool foobool(int argc) { return argc; } +void foobar(int &ref) { +#pragma omp simd reduction(+:ref) + for (int i = 0; i < 10; ++i) + foo(); +} + struct S1; // expected-note {{declared here}} expected-note 4 {{forward declaration of 'S1'}} extern S1 a; class S2 { diff --git a/test/OpenMP/target_parallel_for_reduction_messages.cpp b/test/OpenMP/target_parallel_for_reduction_messages.cpp index 16697a98733b4856d56e0662444d075977ad789f..234b71aec218b68032b6fcd01503850f0049e9a1 100644 --- a/test/OpenMP/target_parallel_for_reduction_messages.cpp +++ b/test/OpenMP/target_parallel_for_reduction_messages.cpp @@ -9,6 +9,12 @@ bool foobool(int argc) { return argc; } +void foobar(int &ref) { +#pragma omp target parallel for reduction(+:ref) + for (int i = 0; i < 10; ++i) + foo(); +} + struct S1; // expected-note {{declared here}} expected-note 4 {{forward declaration of 'S1'}} extern S1 a; class S2 { diff --git a/test/OpenMP/target_parallel_for_simd_reduction_messages.cpp b/test/OpenMP/target_parallel_for_simd_reduction_messages.cpp index 3999d38162843fda98535f608f23f3f941a4eab8..289b5b2641b6200e9c3441f128189b05c7995b12 100644 --- a/test/OpenMP/target_parallel_for_simd_reduction_messages.cpp +++ b/test/OpenMP/target_parallel_for_simd_reduction_messages.cpp @@ -9,6 +9,12 @@ bool foobool(int argc) { return argc; } +void foobar(int &ref) { +#pragma omp target parallel for simd reduction(+:ref) + for (int i = 0; i < 10; ++i) + foo(); +} + struct S1; // expected-note {{declared here}} expected-note 4 {{forward declaration of 'S1'}} extern S1 a; class S2 { diff --git a/test/OpenMP/target_parallel_reduction_messages.cpp b/test/OpenMP/target_parallel_reduction_messages.cpp index c9434e76245b9ba7aee2aadba6aee9a62bf6bb50..52338ee71cbe3d2e5a0c17e976e670afc45f7456 100644 --- a/test/OpenMP/target_parallel_reduction_messages.cpp +++ b/test/OpenMP/target_parallel_reduction_messages.cpp @@ -9,6 +9,11 @@ bool foobool(int argc) { return argc; } +void foobar(int &ref) { +#pragma omp target parallel reduction(+:ref) + foo(); +} + struct S1; // expected-note {{declared here}} expected-note 4 {{forward declaration of 'S1'}} extern S1 a; class S2 { diff --git a/test/OpenMP/teams_reduction_messages.cpp b/test/OpenMP/teams_reduction_messages.cpp index 0420b010bb65b85a755a46e62e382f5483097f05..9974c147b72c2ca32d580345cae95c30c3f0adbc 100644 --- a/test/OpenMP/teams_reduction_messages.cpp +++ b/test/OpenMP/teams_reduction_messages.cpp @@ -9,6 +9,12 @@ bool foobool(int argc) { return argc; } +void foobar(int &ref) { +#pragma omp target +#pragma omp teams reduction(+:ref) + foo(); +} + struct S1; // expected-note {{declared here}} expected-note 4 {{forward declaration of 'S1'}} extern S1 a; class S2 {