Index: lib/Sema/SemaOpenMP.cpp =================================================================== --- lib/Sema/SemaOpenMP.cpp +++ lib/Sema/SemaOpenMP.cpp @@ -9401,7 +9401,7 @@ // 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; Index: test/OpenMP/distribute_parallel_for_reduction_messages.cpp =================================================================== --- test/OpenMP/distribute_parallel_for_reduction_messages.cpp +++ test/OpenMP/distribute_parallel_for_reduction_messages.cpp @@ -9,6 +9,14 @@ 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 { Index: test/OpenMP/distribute_parallel_for_simd_reduction_messages.cpp =================================================================== --- test/OpenMP/distribute_parallel_for_simd_reduction_messages.cpp +++ test/OpenMP/distribute_parallel_for_simd_reduction_messages.cpp @@ -9,6 +9,14 @@ 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 { Index: test/OpenMP/distribute_simd_reduction_messages.cpp =================================================================== --- test/OpenMP/distribute_simd_reduction_messages.cpp +++ test/OpenMP/distribute_simd_reduction_messages.cpp @@ -9,6 +9,14 @@ 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 { Index: test/OpenMP/for_reduction_messages.cpp =================================================================== --- test/OpenMP/for_reduction_messages.cpp +++ test/OpenMP/for_reduction_messages.cpp @@ -9,6 +9,13 @@ 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 { Index: test/OpenMP/for_simd_reduction_messages.cpp =================================================================== --- test/OpenMP/for_simd_reduction_messages.cpp +++ test/OpenMP/for_simd_reduction_messages.cpp @@ -9,6 +9,13 @@ 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 { Index: test/OpenMP/parallel_for_reduction_messages.cpp =================================================================== --- test/OpenMP/parallel_for_reduction_messages.cpp +++ test/OpenMP/parallel_for_reduction_messages.cpp @@ -9,6 +9,12 @@ 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 { Index: test/OpenMP/parallel_for_simd_reduction_messages.cpp =================================================================== --- test/OpenMP/parallel_for_simd_reduction_messages.cpp +++ test/OpenMP/parallel_for_simd_reduction_messages.cpp @@ -9,6 +9,12 @@ 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 { Index: test/OpenMP/parallel_reduction_messages.cpp =================================================================== --- test/OpenMP/parallel_reduction_messages.cpp +++ test/OpenMP/parallel_reduction_messages.cpp @@ -9,6 +9,11 @@ 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 { Index: test/OpenMP/parallel_sections_reduction_messages.cpp =================================================================== --- test/OpenMP/parallel_sections_reduction_messages.cpp +++ test/OpenMP/parallel_sections_reduction_messages.cpp @@ -9,6 +9,13 @@ 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 { Index: test/OpenMP/sections_reduction_messages.cpp =================================================================== --- test/OpenMP/sections_reduction_messages.cpp +++ test/OpenMP/sections_reduction_messages.cpp @@ -9,6 +9,14 @@ 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 { Index: test/OpenMP/simd_reduction_messages.cpp =================================================================== --- test/OpenMP/simd_reduction_messages.cpp +++ test/OpenMP/simd_reduction_messages.cpp @@ -9,6 +9,12 @@ 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 { Index: test/OpenMP/target_parallel_for_reduction_messages.cpp =================================================================== --- test/OpenMP/target_parallel_for_reduction_messages.cpp +++ test/OpenMP/target_parallel_for_reduction_messages.cpp @@ -9,6 +9,12 @@ 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 { Index: test/OpenMP/target_parallel_for_simd_reduction_messages.cpp =================================================================== --- test/OpenMP/target_parallel_for_simd_reduction_messages.cpp +++ test/OpenMP/target_parallel_for_simd_reduction_messages.cpp @@ -9,6 +9,12 @@ 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 { Index: test/OpenMP/target_parallel_reduction_messages.cpp =================================================================== --- test/OpenMP/target_parallel_reduction_messages.cpp +++ test/OpenMP/target_parallel_reduction_messages.cpp @@ -9,6 +9,11 @@ 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 { Index: test/OpenMP/target_simd_reduction_messages.cpp =================================================================== --- test/OpenMP/target_simd_reduction_messages.cpp +++ test/OpenMP/target_simd_reduction_messages.cpp @@ -9,6 +9,12 @@ return argc; } +void foobar(int &ref) { +#pragma omp target 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 { Index: test/OpenMP/teams_distribute_reduction_messages.cpp =================================================================== --- test/OpenMP/teams_distribute_reduction_messages.cpp +++ test/OpenMP/teams_distribute_reduction_messages.cpp @@ -9,6 +9,12 @@ return argc; } +void foobar(int &ref) { +#pragma omp target +#pragma omp teams distribute reduction(+:ref) + for (int j=0; j<100; j++) foo(); +} + struct S1; // expected-note {{declared here}} expected-note 4 {{forward declaration of 'S1'}} extern S1 a; class S2 { Index: test/OpenMP/teams_reduction_messages.cpp =================================================================== --- test/OpenMP/teams_reduction_messages.cpp +++ test/OpenMP/teams_reduction_messages.cpp @@ -9,6 +9,12 @@ 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 {