diff options
| author | Alexey Bataev <a.bataev@hotmail.com> | 2015-07-16 04:19:43 +0000 |
|---|---|---|
| committer | Alexey Bataev <a.bataev@hotmail.com> | 2015-07-16 04:19:43 +0000 |
| commit | 0d08a7ffba519aa7f21b8ac1e2194bf348b34eea (patch) | |
| tree | df3fd5e841153fc1c559c50b8d11a101fe0fa22b | |
| parent | 501a7819989f51b50f88fa9b06b16b8111883ec9 (diff) | |
| download | bcm5719-llvm-0d08a7ffba519aa7f21b8ac1e2194bf348b34eea.tar.gz bcm5719-llvm-0d08a7ffba519aa7f21b8ac1e2194bf348b34eea.zip | |
[OPENMP] Fixed detection of canonical loops with random access iterators.
Add handling of iterators with copy/move constructors with default arguments + converting template constructors.
llvm-svn: 242382
| -rw-r--r-- | clang/lib/Sema/SemaOpenMP.cpp | 10 | ||||
| -rw-r--r-- | clang/test/OpenMP/for_codegen.cpp | 5 | ||||
| -rw-r--r-- | clang/test/OpenMP/for_loop_messages.cpp | 2 | ||||
| -rw-r--r-- | clang/test/OpenMP/for_simd_loop_messages.cpp | 2 | ||||
| -rw-r--r-- | clang/test/OpenMP/parallel_for_loop_messages.cpp | 2 | ||||
| -rw-r--r-- | clang/test/OpenMP/parallel_for_simd_loop_messages.cpp | 2 | ||||
| -rw-r--r-- | clang/test/OpenMP/simd_loop_messages.cpp | 2 |
7 files changed, 14 insertions, 11 deletions
diff --git a/clang/lib/Sema/SemaOpenMP.cpp b/clang/lib/Sema/SemaOpenMP.cpp index 239ede5bb65..e11ab82f88c 100644 --- a/clang/lib/Sema/SemaOpenMP.cpp +++ b/clang/lib/Sema/SemaOpenMP.cpp @@ -2290,8 +2290,9 @@ bool OpenMPIterationSpaceChecker::SetVarAndLB(VarDecl *NewVar, VarRef = NewVarRefExpr; if (auto *CE = dyn_cast_or_null<CXXConstructExpr>(NewLB)) if (const CXXConstructorDecl *Ctor = CE->getConstructor()) - if (Ctor->isCopyConstructor() && CE->getNumArgs() == 1 && - CE->getArg(0) != nullptr) + if ((Ctor->isCopyOrMoveConstructor() || + Ctor->isConvertingConstructor(/*AllowExplicit=*/false)) && + CE->getNumArgs() > 0 && CE->getArg(0) != nullptr) NewLB = CE->getArg(0)->IgnoreParenImpCasts(); LB = NewLB; return false; @@ -2426,8 +2427,9 @@ static const VarDecl *GetInitVarDecl(const Expr *E) { E = getExprAsWritten(E); if (auto *CE = dyn_cast_or_null<CXXConstructExpr>(E)) if (const CXXConstructorDecl *Ctor = CE->getConstructor()) - if (Ctor->isCopyConstructor() && CE->getNumArgs() == 1 && - CE->getArg(0) != nullptr) + if ((Ctor->isCopyOrMoveConstructor() || + Ctor->isConvertingConstructor(/*AllowExplicit=*/false)) && + CE->getNumArgs() > 0 && CE->getArg(0) != nullptr) E = CE->getArg(0)->IgnoreParenImpCasts(); auto DRE = dyn_cast_or_null<DeclRefExpr>(E); if (!DRE) diff --git a/clang/test/OpenMP/for_codegen.cpp b/clang/test/OpenMP/for_codegen.cpp index 539fb7bf02b..7f7e9ba9d25 100644 --- a/clang/test/OpenMP/for_codegen.cpp +++ b/clang/test/OpenMP/for_codegen.cpp @@ -420,8 +420,9 @@ struct Bool { template <typename T> struct It { It() : p(0) {} - It(const It &) ; - It(It &) ; + It(const It &, int = 0) ; + template <typename U> + It(U &, int = 0) ; It &operator=(const It &); It &operator=(It &); ~It() {} diff --git a/clang/test/OpenMP/for_loop_messages.cpp b/clang/test/OpenMP/for_loop_messages.cpp index f425defdf3e..ba27934b11d 100644 --- a/clang/test/OpenMP/for_loop_messages.cpp +++ b/clang/test/OpenMP/for_loop_messages.cpp @@ -562,7 +562,7 @@ int test_with_random_access_iterator() { for (Iter1 I = begin1; I >= end1; ++I) ++I; #pragma omp parallel -// expected-error@+5 {{invalid operands to binary expression ('Iter1' and 'Iter1')}} +// expected-error@+5 {{invalid operands to binary expression ('Iter1' and 'float')}} // expected-error@+4 {{could not calculate number of iterations calling 'operator-' with upper and lower loop bounds}} // Initializer is constructor with all default params. // expected-warning@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}} diff --git a/clang/test/OpenMP/for_simd_loop_messages.cpp b/clang/test/OpenMP/for_simd_loop_messages.cpp index 6e68eb8a082..99b8339840b 100644 --- a/clang/test/OpenMP/for_simd_loop_messages.cpp +++ b/clang/test/OpenMP/for_simd_loop_messages.cpp @@ -544,7 +544,7 @@ int test_with_random_access_iterator() { for (Iter1 I = begin1; I >= end1; ++I) ++I; #pragma omp parallel -// expected-error@+5 {{invalid operands to binary expression ('Iter1' and 'Iter1')}} +// expected-error@+5 {{invalid operands to binary expression ('Iter1' and 'float')}} // expected-error@+4 {{could not calculate number of iterations calling 'operator-' with upper and lower loop bounds}} // Initializer is constructor with all default params. // expected-warning@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}} diff --git a/clang/test/OpenMP/parallel_for_loop_messages.cpp b/clang/test/OpenMP/parallel_for_loop_messages.cpp index 09a15e2dc33..8c0cdf8e9ed 100644 --- a/clang/test/OpenMP/parallel_for_loop_messages.cpp +++ b/clang/test/OpenMP/parallel_for_loop_messages.cpp @@ -467,7 +467,7 @@ int test_with_random_access_iterator() { #pragma omp parallel for for (Iter1 I = begin1; I >= end1; ++I) ++I; -// expected-error@+5 {{invalid operands to binary expression ('Iter1' and 'Iter1')}} +// expected-error@+5 {{invalid operands to binary expression ('Iter1' and 'float')}} // expected-error@+4 {{could not calculate number of iterations calling 'operator-' with upper and lower loop bounds}} // Initializer is constructor with all default params. // expected-warning@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}} diff --git a/clang/test/OpenMP/parallel_for_simd_loop_messages.cpp b/clang/test/OpenMP/parallel_for_simd_loop_messages.cpp index 0473b248a69..94bd37c596e 100644 --- a/clang/test/OpenMP/parallel_for_simd_loop_messages.cpp +++ b/clang/test/OpenMP/parallel_for_simd_loop_messages.cpp @@ -467,7 +467,7 @@ int test_with_random_access_iterator() { #pragma omp parallel for simd for (Iter1 I = begin1; I >= end1; ++I) ++I; -// expected-error@+5 {{invalid operands to binary expression ('Iter1' and 'Iter1')}} +// expected-error@+5 {{invalid operands to binary expression ('Iter1' and 'float')}} // expected-error@+4 {{could not calculate number of iterations calling 'operator-' with upper and lower loop bounds}} // Initializer is constructor with all default params. // expected-warning@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}} diff --git a/clang/test/OpenMP/simd_loop_messages.cpp b/clang/test/OpenMP/simd_loop_messages.cpp index fe8e70a9b8a..bd7dd5bf52d 100644 --- a/clang/test/OpenMP/simd_loop_messages.cpp +++ b/clang/test/OpenMP/simd_loop_messages.cpp @@ -456,7 +456,7 @@ int test_with_random_access_iterator() { ++I; // Initializer is constructor with all default params. - // expected-error@+4 {{invalid operands to binary expression ('Iter1' and 'Iter1')}} + // expected-error@+4 {{invalid operands to binary expression ('Iter1' and 'float')}} // expected-error@+3 {{could not calculate number of iterations calling 'operator-' with upper and lower loop bounds}} // expected-warning@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}} #pragma omp simd |

