From b1b3141a30d56f4feb3cc68f57d1ebaf6fbad246 Mon Sep 17 00:00:00 2001 From: David Sheinkman Date: Tue, 4 Oct 2016 14:41:36 +0000 Subject: [PATCH] [OpenMP] fix segfault when a variable referenced in reduction clause is a reference parameter\nDifferential Revision: http://reviews.llvm.org/D24524 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@283223 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Sema/SemaOpenMP.cpp | 2 +- .../OpenMP/distribute_parallel_for_reduction_messages.cpp | 8 ++++++++ .../distribute_parallel_for_simd_reduction_messages.cpp | 8 ++++++++ test/OpenMP/distribute_simd_reduction_messages.cpp | 8 ++++++++ test/OpenMP/for_reduction_messages.cpp | 7 +++++++ test/OpenMP/for_simd_reduction_messages.cpp | 7 +++++++ test/OpenMP/parallel_for_reduction_messages.cpp | 6 ++++++ test/OpenMP/parallel_for_simd_reduction_messages.cpp | 6 ++++++ test/OpenMP/parallel_reduction_messages.cpp | 5 +++++ test/OpenMP/parallel_sections_reduction_messages.cpp | 7 +++++++ test/OpenMP/sections_reduction_messages.cpp | 8 ++++++++ test/OpenMP/simd_reduction_messages.cpp | 6 ++++++ test/OpenMP/target_parallel_for_reduction_messages.cpp | 6 ++++++ .../target_parallel_for_simd_reduction_messages.cpp | 6 ++++++ test/OpenMP/target_parallel_reduction_messages.cpp | 5 +++++ test/OpenMP/target_simd_reduction_messages.cpp | 6 ++++++ test/OpenMP/teams_distribute_reduction_messages.cpp | 6 ++++++ test/OpenMP/teams_reduction_messages.cpp | 6 ++++++ 18 files changed, 112 insertions(+), 1 deletion(-) diff --git a/lib/Sema/SemaOpenMP.cpp b/lib/Sema/SemaOpenMP.cpp index 5cbcea4cce..7dcd81f69d 100644 --- a/lib/Sema/SemaOpenMP.cpp +++ b/lib/Sema/SemaOpenMP.cpp @@ -9401,7 +9401,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 f23a25e28c..95654a9e50 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 7b7e9ea53c..6ad41d72bf 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 e03b852928..fca3e85a71 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 45a4681440..bb70ecc2b2 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 2935cec602..485070e758 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 4d5a143bae..57ab1fac9c 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 afb0b367c4..60a947dd5f 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 af1f5ed7bc..947353fc2d 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 52d4cb9cdc..05cc7f0f6c 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 134bf619c9..f13c5b3f28 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 c47d53eb91..1e1a233ec4 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 16697a9873..234b71aec2 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 3999d38162..289b5b2641 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 c9434e7624..52338ee71c 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/target_simd_reduction_messages.cpp b/test/OpenMP/target_simd_reduction_messages.cpp index 61c7ddeae7..ca14acb229 100644 --- a/test/OpenMP/target_simd_reduction_messages.cpp +++ b/test/OpenMP/target_simd_reduction_messages.cpp @@ -9,6 +9,12 @@ bool foobool(int argc) { 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 { diff --git a/test/OpenMP/teams_distribute_reduction_messages.cpp b/test/OpenMP/teams_distribute_reduction_messages.cpp index 63023c2844..d0a6d296c0 100644 --- a/test/OpenMP/teams_distribute_reduction_messages.cpp +++ b/test/OpenMP/teams_distribute_reduction_messages.cpp @@ -9,6 +9,12 @@ bool foobool(int argc) { 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 { diff --git a/test/OpenMP/teams_reduction_messages.cpp b/test/OpenMP/teams_reduction_messages.cpp index 0420b010bb..9974c147b7 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 { -- 2.50.1