diff options
| author | Alexey Bataev <a.bataev@hotmail.com> | 2020-01-08 09:39:44 -0500 |
|---|---|---|
| committer | Alexey Bataev <a.bataev@hotmail.com> | 2020-01-08 10:00:11 -0500 |
| commit | c74a8adda3bc4fc5714aef14cdcfda944d3038a0 (patch) | |
| tree | e36101321bd6aeae91354d00741c17280dd72c2a | |
| parent | ead815924e6ebeaf02c31c37ebf7a560b5fdf67b (diff) | |
| download | bcm5719-llvm-c74a8adda3bc4fc5714aef14cdcfda944d3038a0.tar.gz bcm5719-llvm-c74a8adda3bc4fc5714aef14cdcfda944d3038a0.zip | |
[OPENMP]Allow comma in combiner expression.
Use ParseExpression() instead of ParseAssignmentExpression() to allow
commas in combiner expressions.
| -rw-r--r-- | clang/lib/Parse/ParseOpenMP.cpp | 5 | ||||
| -rw-r--r-- | clang/test/OpenMP/declare_reduction_ast_print.cpp | 14 |
2 files changed, 14 insertions, 5 deletions
diff --git a/clang/lib/Parse/ParseOpenMP.cpp b/clang/lib/Parse/ParseOpenMP.cpp index 31ae3af70b7..24855df334f 100644 --- a/clang/lib/Parse/ParseOpenMP.cpp +++ b/clang/lib/Parse/ParseOpenMP.cpp @@ -343,9 +343,8 @@ Parser::ParseOpenMPDeclareReductionDirective(AccessSpecifier AS) { Scope::OpenMPDirectiveScope); // Parse <combiner> expression. Actions.ActOnOpenMPDeclareReductionCombinerStart(getCurScope(), D); - ExprResult CombinerResult = - Actions.ActOnFinishFullExpr(ParseAssignmentExpression().get(), - D->getLocation(), /*DiscardedValue*/ false); + ExprResult CombinerResult = Actions.ActOnFinishFullExpr( + ParseExpression().get(), D->getLocation(), /*DiscardedValue*/ false); Actions.ActOnOpenMPDeclareReductionCombinerEnd(D, CombinerResult.get()); if (CombinerResult.isInvalid() && Tok.isNot(tok::r_paren) && diff --git a/clang/test/OpenMP/declare_reduction_ast_print.cpp b/clang/test/OpenMP/declare_reduction_ast_print.cpp index 6344394cfdb..8de954efd9e 100644 --- a/clang/test/OpenMP/declare_reduction_ast_print.cpp +++ b/clang/test/OpenMP/declare_reduction_ast_print.cpp @@ -23,14 +23,24 @@ namespace N1 // CHECK: #pragma omp declare reduction (+ : int : omp_out *= omp_in){{$}} // CHECK-NEXT: #pragma omp declare reduction (+ : char : omp_out *= omp_in) + template <class T> class SSS { public: #pragma omp declare reduction(fun : T : omp_out += omp_in) initializer(omp_priv = omp_orig + 15) - // CHECK: #pragma omp declare reduction (fun : T : omp_out += omp_in) initializer(omp_priv = omp_orig + 15) - // CHECK: #pragma omp declare reduction (fun : int : omp_out += omp_in) initializer(omp_priv = omp_orig + 15) +#pragma omp declare reduction(fun1 : T : omp_out=1, omp_out=foo(omp_in)) initializer(omp_priv = omp_orig + 14) + static T foo(T &); }; +// CHECK: template <class T> class SSS { +// CHECK: #pragma omp declare reduction (fun : T : omp_out += omp_in) initializer(omp_priv = omp_orig + 15) +// CHECK: #pragma omp declare reduction (fun1 : T : omp_out = 1 , omp_out = foo(omp_in)) initializer(omp_priv = omp_orig + 14) +// CHECK: }; +// CHECK: template<> class SSS<int> { +// CHECK: #pragma omp declare reduction (fun : int : omp_out += omp_in) initializer(omp_priv = omp_orig + 15) +// CHECK: #pragma omp declare reduction (fun1 : int : omp_out = 1 , omp_out = foo(omp_in)) initializer(omp_priv = omp_orig + 14) +// CHECK: }; + SSS<int> d; void init(SSS<int> &lhs, SSS<int> rhs); |

