This was added in OpenACC PR #511 in the 3.4 branch. From an AST/Sema perspective this is pretty trivial as the infrastructure for 'if' already exists, however the atomic construct needed to be taught to take clauses. This patch does that and adds some testing to do so.
1868 lines
70 KiB
C++
1868 lines
70 KiB
C++
// RUN: %clang_cc1 %s -fopenacc -Wno-unused-value -verify
|
|
|
|
void NormalFunc(int I) {
|
|
// No clauses are valid, but we parse them anyway, just mark them as not valid
|
|
// on this construct.
|
|
|
|
// expected-error@+1{{OpenACC 'copy' clause is not valid on 'atomic' directive}}
|
|
#pragma acc atomic copy(I)
|
|
I = I + 1;
|
|
// expected-error@+1{{OpenACC 'copy' clause is not valid on 'atomic' directive}}
|
|
#pragma acc atomic read copy(I)
|
|
I = I;
|
|
}
|
|
|
|
struct Struct{
|
|
Struct *getPtr();
|
|
Struct &operator++();
|
|
Struct &operator--();
|
|
Struct &operator++(int);
|
|
Struct &operator--(int);
|
|
|
|
Struct &operator+=(int);
|
|
Struct &operator*=(int);
|
|
Struct &operator-=(int);
|
|
Struct &operator/=(int);
|
|
Struct &operator&=(int);
|
|
Struct &operator|=(int);
|
|
Struct &operator<<=(int);
|
|
Struct &operator>>=(int);
|
|
Struct &operator^=(int);
|
|
Struct &operator%=(int);
|
|
Struct &operator!=(int);
|
|
Struct &operator+();
|
|
Struct &operator-();
|
|
|
|
operator int();
|
|
void operator()();
|
|
Struct &operator*();
|
|
Struct &operator=(int);
|
|
};
|
|
|
|
int operator+(Struct&, int);
|
|
int operator+(int, Struct&);
|
|
Struct &operator+(Struct&, Struct&);
|
|
Struct &operator*(Struct&, Struct&);
|
|
Struct &operator-(Struct&, Struct&);
|
|
|
|
Struct S1, S2;
|
|
|
|
struct NotCondition{} NC;
|
|
|
|
template<typename T>
|
|
T &getRValue();
|
|
|
|
void IfClause(int x, int v) {
|
|
// expected-error@+1{{OpenACC 'seq' clause is not valid on 'atomic' directive}}
|
|
#pragma acc atomic read seq
|
|
x = v;
|
|
|
|
// expected-error@+1{{expected '('}}
|
|
#pragma acc atomic read if
|
|
x = v;
|
|
|
|
// expected-error@+1{{value of type 'struct NotCondition' is not contextually convertible to 'bool'}}
|
|
#pragma acc atomic read if(NC)
|
|
x = v;
|
|
|
|
// expected-error@+2{{OpenACC 'if' clause cannot appear more than once on a 'atomic' directive}}
|
|
// expected-note@+1{{previous clause is here}}
|
|
#pragma acc atomic read if(x) if (v)
|
|
x = v;
|
|
}
|
|
|
|
template<typename T>
|
|
void AtomicReadTemplate(T LHS, T RHS) {
|
|
#pragma acc atomic read
|
|
LHS = RHS;
|
|
|
|
T *LHSPtr, *RHSPtr;
|
|
|
|
#pragma acc atomic read
|
|
LHSPtr = RHSPtr;
|
|
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic read' directive is invalid}}
|
|
// expected-note@+2{{right operand to assignment expression must be an l-value}}
|
|
#pragma acc atomic read
|
|
LHS = RHS + 1;
|
|
|
|
#pragma acc atomic read
|
|
*LHSPtr = RHS;
|
|
|
|
#pragma acc atomic read
|
|
LHS = *RHSPtr;
|
|
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic read' directive is invalid}}
|
|
// expected-note@+2{{right operand to assignment expression must be an l-value}}
|
|
#pragma acc atomic read
|
|
LHS = getRValue<T>();
|
|
}
|
|
|
|
template<typename T>
|
|
void AtomicReadTemplate2(T LHS, T RHS) {
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic read' directive is invalid}}
|
|
// expected-note@+2{{left operand to assignment expression must be of scalar type (was 'Struct')}}
|
|
#pragma acc atomic read
|
|
LHS = RHS;
|
|
|
|
T *LHSPtr, *RHSPtr;
|
|
// Fine, now a pointer.
|
|
#pragma acc atomic read
|
|
LHSPtr = RHSPtr;
|
|
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic read' directive is invalid}}
|
|
// expected-note@+2{{right operand to assignment expression must be an l-value}}
|
|
#pragma acc atomic read
|
|
LHS = *RHS.getPtr();
|
|
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic read' directive is invalid}}
|
|
// expected-note@+2{{left operand to assignment expression must be of scalar type (was 'Struct')}}
|
|
#pragma acc atomic read
|
|
*LHSPtr = RHS;
|
|
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic read' directive is invalid}}
|
|
// expected-note@+2{{left operand to assignment expression must be of scalar type (was 'Struct')}}
|
|
#pragma acc atomic read
|
|
LHS = *RHSPtr;
|
|
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic read' directive is invalid}}
|
|
// expected-note@+2{{left operand to assignment expression must be an l-value}}
|
|
#pragma acc atomic read
|
|
getRValue<T>() = getRValue<T>();
|
|
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic read' directive is invalid}}
|
|
// expected-note@+2{{right operand to assignment expression must be an l-value}}
|
|
#pragma acc atomic read
|
|
LHS = getRValue<T>();
|
|
}
|
|
|
|
void AtomicRead(int LHS, int RHS) {
|
|
AtomicReadTemplate(LHS, RHS);
|
|
AtomicReadTemplate2(S1, S2); // expected-note{{in instantiation of function template specialization}}
|
|
|
|
#pragma acc atomic read
|
|
LHS = RHS;
|
|
|
|
int *LHSPtr, *RHSPtr;
|
|
|
|
#pragma acc atomic read
|
|
LHSPtr = RHSPtr;
|
|
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic read' directive is invalid}}
|
|
// expected-note@+2{{left operand to assignment expression must be of scalar type (was 'Struct')}}
|
|
#pragma acc atomic read
|
|
S1 = S2;
|
|
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic read' directive is invalid}}
|
|
// expected-note@+2{{right operand to assignment expression must be an l-value}}
|
|
#pragma acc atomic read
|
|
LHS = RHS + 1;
|
|
|
|
#pragma acc atomic read
|
|
*LHSPtr = RHS;
|
|
|
|
#pragma acc atomic read
|
|
LHS = *RHSPtr;
|
|
|
|
// There is no way to test that = is an overloaded operator, since there
|
|
// really isn't a way to create an operator= without a class type on one side
|
|
// or the other.
|
|
}
|
|
|
|
template<typename T>
|
|
void AtomicWriteTemplate(T LHS, T RHS) {
|
|
#pragma acc atomic write
|
|
LHS = RHS;
|
|
|
|
T *LHSPtr, *RHSPtr;
|
|
#pragma acc atomic write
|
|
LHSPtr = RHSPtr;
|
|
|
|
#pragma acc atomic write
|
|
*LHSPtr = *RHSPtr;
|
|
|
|
// allowed, expr is ok.
|
|
#pragma acc atomic write
|
|
LHS = *RHSPtr;
|
|
|
|
#pragma acc atomic write
|
|
LHS = RHS * 2;
|
|
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic write' directive is invalid}}
|
|
// expected-note@+2{{left operand to assignment expression must be an l-value}}
|
|
#pragma acc atomic write
|
|
getRValue<T>() = getRValue<T>();
|
|
|
|
#pragma acc atomic write
|
|
LHS = getRValue<T>();
|
|
}
|
|
|
|
template<typename T>
|
|
void AtomicWriteTemplate2(T LHS, T RHS) {
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic write' directive is invalid}}
|
|
// expected-note@+2{{left operand to assignment expression must be of scalar type (was 'Struct')}}
|
|
#pragma acc atomic write
|
|
LHS = RHS;
|
|
|
|
T *LHSPtr, *RHSPtr;
|
|
#pragma acc atomic write
|
|
LHSPtr = RHSPtr;
|
|
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic write' directive is invalid}}
|
|
// expected-note@+2{{left operand to assignment expression must be of scalar type (was 'Struct')}}
|
|
#pragma acc atomic write
|
|
LHS = *RHSPtr;
|
|
|
|
#pragma acc atomic write
|
|
LHSPtr = RHS.getPtr();
|
|
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic write' directive is invalid}}
|
|
// expected-note@+2{{left operand to assignment expression must be an l-value}}
|
|
#pragma acc atomic write
|
|
getRValue<T>() = getRValue<T>();
|
|
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic write' directive is invalid}}
|
|
// expected-note@+2{{left operand to assignment expression must be of scalar type (was 'Struct')}}
|
|
#pragma acc atomic write
|
|
LHS = getRValue<T>();
|
|
}
|
|
|
|
void AtomicWrite(int LHS, int RHS) {
|
|
AtomicWriteTemplate(LHS, RHS);
|
|
AtomicWriteTemplate2(S1, S2); // expected-note{{in instantiation of function template specialization}}
|
|
|
|
#pragma acc atomic write
|
|
LHS = RHS;
|
|
|
|
int *LHSPtr, *RHSPtr;
|
|
#pragma acc atomic write
|
|
LHSPtr = RHSPtr;
|
|
|
|
#pragma acc atomic write
|
|
*LHSPtr = *RHSPtr;
|
|
|
|
// allowed, expr is ok.
|
|
#pragma acc atomic write
|
|
LHS = *RHSPtr;
|
|
|
|
#pragma acc atomic write
|
|
LHS = RHS * 2;
|
|
}
|
|
|
|
template<typename T>
|
|
void AtomicUpdateTemplate(T LHS, T RHS) {
|
|
#pragma acc atomic
|
|
LHS++;
|
|
|
|
#pragma acc atomic update
|
|
LHS--;
|
|
|
|
#pragma acc atomic
|
|
++LHS;
|
|
|
|
#pragma acc atomic update
|
|
--LHS;
|
|
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic' directive is invalid}}
|
|
// expected-note@+2{{unary operator not supported, only increment and decrement operations permitted}}
|
|
#pragma acc atomic
|
|
+LHS;
|
|
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic update' directive is invalid}}
|
|
// expected-note@+2{{unary operator not supported, only increment and decrement operations permitted}}
|
|
#pragma acc atomic update
|
|
-LHS;
|
|
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic update' directive is invalid}}
|
|
// expected-note@+2{{expected binary operation on right hand side of assignment operator}}
|
|
#pragma acc atomic update
|
|
LHS = RHS;
|
|
|
|
T *LHSPtr, *RHSPtr;
|
|
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic' directive is invalid}}
|
|
// expected-note@+2{{expected binary operation on right hand side of assignment operator}}
|
|
#pragma acc atomic
|
|
*LHSPtr = *RHSPtr;
|
|
|
|
// x binop= expr;
|
|
#pragma acc atomic
|
|
LHS += 1 + RHS;
|
|
#pragma acc atomic update
|
|
LHS *= 1 + RHS;
|
|
#pragma acc atomic
|
|
LHS -= 1 + RHS;
|
|
#pragma acc atomic update
|
|
LHS /= 1 + RHS;
|
|
#pragma acc atomic
|
|
LHS &= 1 + RHS;
|
|
#pragma acc atomic update
|
|
LHS ^= 1 + RHS;
|
|
#pragma acc atomic
|
|
LHS |= 1 + RHS;
|
|
#pragma acc atomic update
|
|
LHS <<= 1 + RHS;
|
|
#pragma acc atomic
|
|
LHS >>= 1 + RHS;
|
|
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic update' directive is invalid}}
|
|
// expected-note@+2{{compound binary operator not supported, only +=, *=, -=, /=, &=, ^=, |=, <<=, or >>= are permitted}}
|
|
#pragma acc atomic update
|
|
LHS != 1 + RHS;
|
|
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic update' directive is invalid}}
|
|
// expected-note@+2{{compound binary operator not supported, only +=, *=, -=, /=, &=, ^=, |=, <<=, or >>= are permitted}}
|
|
#pragma acc atomic update
|
|
LHS <= 1 + RHS;
|
|
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic update' directive is invalid}}
|
|
// expected-note@+2{{compound binary operator not supported, only +=, *=, -=, /=, &=, ^=, |=, <<=, or >>= are permitted}}
|
|
#pragma acc atomic update
|
|
LHS >= 1 + RHS;
|
|
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic update' directive is invalid}}
|
|
// expected-note@+2{{compound binary operator not supported, only +=, *=, -=, /=, &=, ^=, |=, <<=, or >>= are permitted}}
|
|
#pragma acc atomic update
|
|
LHS %= 1 + RHS;
|
|
|
|
// x = x binop expr.
|
|
#pragma acc atomic
|
|
LHS = LHS + getRValue<T>();
|
|
#pragma acc atomic update
|
|
LHS = LHS * getRValue<T>();
|
|
#pragma acc atomic update
|
|
LHS = LHS - getRValue<T>();
|
|
#pragma acc atomic update
|
|
LHS = LHS / getRValue<T>();
|
|
#pragma acc atomic update
|
|
LHS = LHS & getRValue<T>();
|
|
#pragma acc atomic update
|
|
LHS = LHS ^ getRValue<T>();
|
|
#pragma acc atomic update
|
|
LHS = LHS | getRValue<T>();
|
|
#pragma acc atomic update
|
|
LHS = LHS << getRValue<T>();
|
|
#pragma acc atomic update
|
|
LHS = LHS >> getRValue<T>();
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic update' directive is invalid}}
|
|
// expected-note@+2{{binary operator not supported, only +, *, -, /, &, ^, |, <<, or >> are permitted}}
|
|
#pragma acc atomic update
|
|
LHS = LHS < getRValue<T>();
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic update' directive is invalid}}
|
|
// expected-note@+2{{binary operator not supported, only +, *, -, /, &, ^, |, <<, or >> are permitted}}
|
|
#pragma acc atomic update
|
|
LHS = LHS > getRValue<T>();
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic update' directive is invalid}}
|
|
// expected-note@+2{{binary operator not supported, only +, *, -, /, &, ^, |, <<, or >> are permitted}}
|
|
#pragma acc atomic update
|
|
LHS = LHS <= getRValue<T>();
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic update' directive is invalid}}
|
|
// expected-note@+2{{binary operator not supported, only +, *, -, /, &, ^, |, <<, or >> are permitted}}
|
|
#pragma acc atomic update
|
|
LHS = LHS >= getRValue<T>();
|
|
#pragma acc atomic update
|
|
LHS = LHS ^ getRValue<T>();
|
|
|
|
|
|
// x = expr binop x.
|
|
#pragma acc atomic
|
|
LHS = getRValue<T>() + LHS;
|
|
#pragma acc atomic update
|
|
LHS = getRValue<T>() * LHS;
|
|
#pragma acc atomic update
|
|
LHS = getRValue<T>() - LHS;
|
|
#pragma acc atomic update
|
|
LHS = getRValue<T>() / LHS;
|
|
#pragma acc atomic update
|
|
LHS = getRValue<T>() & LHS;
|
|
#pragma acc atomic update
|
|
LHS = getRValue<T>() ^ LHS;
|
|
#pragma acc atomic update
|
|
LHS = getRValue<T>() | LHS;
|
|
#pragma acc atomic update
|
|
LHS = getRValue<T>() << LHS;
|
|
#pragma acc atomic update
|
|
LHS = getRValue<T>() >> LHS;
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic update' directive is invalid}}
|
|
// expected-note@+2{{binary operator not supported, only +, *, -, /, &, ^, |, <<, or >> are permitted}}
|
|
#pragma acc atomic update
|
|
LHS = getRValue<T>() < LHS;
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic update' directive is invalid}}
|
|
// expected-note@+2{{binary operator not supported, only +, *, -, /, &, ^, |, <<, or >> are permitted}}
|
|
#pragma acc atomic update
|
|
LHS = getRValue<T>() > LHS;
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic update' directive is invalid}}
|
|
// expected-note@+2{{binary operator not supported, only +, *, -, /, &, ^, |, <<, or >> are permitted}}
|
|
#pragma acc atomic update
|
|
LHS = getRValue<T>() <= LHS;
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic update' directive is invalid}}
|
|
// expected-note@+2{{binary operator not supported, only +, *, -, /, &, ^, |, <<, or >> are permitted}}
|
|
#pragma acc atomic update
|
|
LHS = getRValue<T>() >= LHS;
|
|
#pragma acc atomic update
|
|
LHS = getRValue<T>() ^ LHS;
|
|
|
|
#pragma acc atomic update
|
|
LHS = LHS + getRValue<T>();
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic update' directive is invalid}}
|
|
// expected-note@+2{{left hand side of assignment operation('LHS') must match one side of the sub-operation on the right hand side('RHS' and 'getRValue<T>()')}}
|
|
#pragma acc atomic update
|
|
LHS = RHS + getRValue<T>();
|
|
|
|
#pragma acc atomic update
|
|
LHS = getRValue<T>() - LHS;
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic update' directive is invalid}}
|
|
// expected-note@+2{{left hand side of assignment operation('LHS') must match one side of the sub-operation on the right hand side('getRValue<T>()' and 'RHS')}}
|
|
#pragma acc atomic update
|
|
LHS = getRValue<T>() + RHS;
|
|
}
|
|
|
|
template<typename T>
|
|
void AtomicUpdateTemplate2(T LHS, T RHS) {
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic' directive is invalid}}
|
|
// expected-note@+2{{operand to increment expression must be of scalar type (was 'Struct')}}
|
|
#pragma acc atomic
|
|
LHS++;
|
|
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic update' directive is invalid}}
|
|
// expected-note@+2{{operand to decrement expression must be of scalar type (was 'Struct')}}
|
|
#pragma acc atomic update
|
|
LHS--;
|
|
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic' directive is invalid}}
|
|
// expected-note@+2{{operand to increment expression must be of scalar type (was 'Struct')}}
|
|
#pragma acc atomic
|
|
++LHS;
|
|
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic update' directive is invalid}}
|
|
// expected-note@+2{{operand to decrement expression must be of scalar type (was 'Struct')}}
|
|
#pragma acc atomic update
|
|
--LHS;
|
|
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic' directive is invalid}}
|
|
// expected-note@+2{{unary operator not supported, only increment and decrement operations permitted}}
|
|
#pragma acc atomic
|
|
+LHS;
|
|
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic update' directive is invalid}}
|
|
// expected-note@+2{{unary operator not supported, only increment and decrement operations permitted}}
|
|
#pragma acc atomic update
|
|
-LHS;
|
|
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic' directive is invalid}}
|
|
// expected-note@+2{{expected assignment, compound assignment, increment, or decrement expression}}
|
|
#pragma acc atomic
|
|
LHS();
|
|
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic' directive is invalid}}
|
|
// expected-note@+2{{unary operator not supported, only increment and decrement operations permitted}}
|
|
#pragma acc atomic
|
|
*LHS;
|
|
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic update' directive is invalid}}
|
|
// expected-note@+2{{expected binary operation on right hand side of assignment operator}}
|
|
#pragma acc atomic update
|
|
LHS = RHS;
|
|
|
|
T *LHSPtr, *RHSPtr;
|
|
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic' directive is invalid}}
|
|
// expected-note@+2{{expected binary operation on right hand side of assignment operator}}
|
|
#pragma acc atomic
|
|
*LHSPtr = *RHSPtr;
|
|
|
|
// x binop= expr;
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic' directive is invalid}}
|
|
// expected-note@+2{{left operand to compound assignment expression must be of scalar type (was 'Struct')}}
|
|
#pragma acc atomic
|
|
LHS += 1 + RHS;
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic update' directive is invalid}}
|
|
// expected-note@+2{{left operand to compound assignment expression must be of scalar type (was 'Struct')}}
|
|
#pragma acc atomic update
|
|
LHS *= 1 + RHS;
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic' directive is invalid}}
|
|
// expected-note@+2{{left operand to compound assignment expression must be of scalar type (was 'Struct')}}
|
|
#pragma acc atomic
|
|
LHS -= 1 + RHS;
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic update' directive is invalid}}
|
|
// expected-note@+2{{left operand to compound assignment expression must be of scalar type (was 'Struct')}}
|
|
#pragma acc atomic update
|
|
LHS /= 1 + RHS;
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic' directive is invalid}}
|
|
// expected-note@+2{{left operand to compound assignment expression must be of scalar type (was 'Struct')}}
|
|
#pragma acc atomic
|
|
LHS &= 1 + RHS;
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic update' directive is invalid}}
|
|
// expected-note@+2{{left operand to compound assignment expression must be of scalar type (was 'Struct')}}
|
|
#pragma acc atomic update
|
|
LHS ^= 1 + RHS;
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic' directive is invalid}}
|
|
// expected-note@+2{{left operand to compound assignment expression must be of scalar type (was 'Struct')}}
|
|
#pragma acc atomic
|
|
LHS |= 1 + RHS;
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic update' directive is invalid}}
|
|
// expected-note@+2{{left operand to compound assignment expression must be of scalar type (was 'Struct')}}
|
|
#pragma acc atomic update
|
|
LHS <<= 1 + RHS;
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic' directive is invalid}}
|
|
// expected-note@+2{{left operand to compound assignment expression must be of scalar type (was 'Struct')}}
|
|
#pragma acc atomic
|
|
LHS >>= 1 + RHS;
|
|
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic update' directive is invalid}}
|
|
// expected-note@+2{{compound binary operator not supported, only +=, *=, -=, /=, &=, ^=, |=, <<=, or >>= are permitted}}
|
|
#pragma acc atomic update
|
|
LHS != 1 + RHS;
|
|
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic update' directive is invalid}}
|
|
// expected-note@+2{{compound binary operator not supported, only +=, *=, -=, /=, &=, ^=, |=, <<=, or >>= are permitted}}
|
|
#pragma acc atomic update
|
|
LHS %= 1 + RHS;
|
|
|
|
// x = x binop expr.
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic' directive is invalid}}
|
|
// expected-note@+2{{left operand to assignment expression must be of scalar type (was 'Struct')}}
|
|
#pragma acc atomic
|
|
LHS = LHS + getRValue<T>();
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic update' directive is invalid}}
|
|
// expected-note@+2{{left operand to assignment expression must be of scalar type (was 'Struct')}}
|
|
#pragma acc atomic update
|
|
LHS = LHS * getRValue<T>();
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic update' directive is invalid}}
|
|
// expected-note@+2{{left operand to assignment expression must be of scalar type (was 'Struct')}}
|
|
#pragma acc atomic update
|
|
LHS = LHS - getRValue<T>();
|
|
|
|
// x = expr binop x.
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic' directive is invalid}}
|
|
// expected-note@+2{{left operand to assignment expression must be of scalar type (was 'Struct')}}
|
|
#pragma acc atomic
|
|
LHS = getRValue<T>() + LHS;
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic update' directive is invalid}}
|
|
// expected-note@+2{{left operand to assignment expression must be of scalar type (was 'Struct')}}
|
|
#pragma acc atomic update
|
|
LHS = getRValue<T>() * LHS;
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic update' directive is invalid}}
|
|
// expected-note@+2{{left operand to assignment expression must be of scalar type (was 'Struct')}}
|
|
#pragma acc atomic update
|
|
LHS = getRValue<T>() - LHS;
|
|
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic update' directive is invalid}}
|
|
// expected-note@+2{{left operand to assignment expression must be of scalar type (was 'Struct')}}
|
|
#pragma acc atomic update
|
|
LHS = LHS + getRValue<T>();
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic update' directive is invalid}}
|
|
// expected-note@+2{{left hand side of assignment operation('LHS') must match one side of the sub-operation on the right hand side('RHS' and 'getRValue<T>()')}}
|
|
#pragma acc atomic update
|
|
LHS = RHS + getRValue<T>();
|
|
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic update' directive is invalid}}
|
|
// expected-note@+2{{left operand to assignment expression must be of scalar type (was 'Struct')}}
|
|
#pragma acc atomic update
|
|
LHS = getRValue<T>() - LHS;
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic update' directive is invalid}}
|
|
// expected-note@+2{{left hand side of assignment operation('LHS') must match one side of the sub-operation on the right hand side('getRValue<T>()' and 'RHS')}}
|
|
#pragma acc atomic update
|
|
LHS = getRValue<T>() + RHS;
|
|
}
|
|
|
|
void AtomicUpdate() {
|
|
AtomicUpdateTemplate(1, 2);
|
|
AtomicUpdateTemplate2(S1, S2); //expected-note{{in instantiation of function template specialization}}
|
|
|
|
int I, J;
|
|
|
|
#pragma acc atomic
|
|
I++;
|
|
#pragma acc atomic update
|
|
--I;
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic' directive is invalid}}
|
|
// expected-note@+2{{operand to increment expression must be of scalar type (was 'Struct')}}
|
|
#pragma acc atomic
|
|
S1++;
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic update' directive is invalid}}
|
|
// expected-note@+2{{operand to decrement expression must be of scalar type (was 'Struct')}}
|
|
#pragma acc atomic update
|
|
--S2;
|
|
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic' directive is invalid}}
|
|
// expected-note@+2{{unary operator not supported, only increment and decrement operations permitted}}
|
|
#pragma acc atomic
|
|
+I;
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic update' directive is invalid}}
|
|
// expected-note@+2{{unary operator not supported, only increment and decrement operations permitted}}
|
|
#pragma acc atomic update
|
|
-J;
|
|
|
|
#pragma acc atomic update
|
|
I ^= 1 + J;
|
|
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic update' directive is invalid}}
|
|
// expected-note@+2{{compound binary operator not supported, only +=, *=, -=, /=, &=, ^=, |=, <<=, or >>= are permitted}}
|
|
#pragma acc atomic update
|
|
I%= 1 + J;
|
|
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic update' directive is invalid}}
|
|
// expected-note@+2{{left operand to compound assignment expression must be of scalar type (was 'Struct')}}
|
|
#pragma acc atomic update
|
|
S1 ^= 1 + J;
|
|
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic update' directive is invalid}}
|
|
// expected-note@+2{{compound binary operator not supported, only +=, *=, -=, /=, &=, ^=, |=, <<=, or >>= are permitted}}
|
|
#pragma acc atomic update
|
|
S2 %= 1 + J;
|
|
|
|
#pragma acc atomic update
|
|
I = I + getRValue<int>();
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic update' directive is invalid}}
|
|
// expected-note@+2{{left hand side of assignment operation('I') must match one side of the sub-operation on the right hand side('J' and 'getRValue<int>()')}}
|
|
#pragma acc atomic update
|
|
I = J + getRValue<int>();
|
|
|
|
#pragma acc atomic update
|
|
I = getRValue<int>() - I;
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic update' directive is invalid}}
|
|
// expected-note@+2{{left hand side of assignment operation('I') must match one side of the sub-operation on the right hand side('getRValue<int>()' and 'J')}}
|
|
#pragma acc atomic update
|
|
I = getRValue<int>() + J;
|
|
}
|
|
|
|
template<typename T>
|
|
void AtomicCaptureTemplateSimple(T LHS, T RHS) {
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+2{{expected assignment expression}}
|
|
#pragma acc atomic capture
|
|
LHS++;
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+2{{expected assignment expression}}
|
|
#pragma acc atomic capture
|
|
--LHS;
|
|
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+2{{expected assignment expression}}
|
|
#pragma acc atomic capture
|
|
LHS += 1 + RHS;
|
|
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+2{{expected assignment, compound assignment, increment, or decrement expression}}
|
|
#pragma acc atomic capture
|
|
LHS = RHS;
|
|
|
|
#pragma acc atomic capture
|
|
LHS = RHS++;
|
|
|
|
#pragma acc atomic capture
|
|
LHS = RHS--;
|
|
|
|
#pragma acc atomic capture
|
|
LHS = ++RHS;
|
|
|
|
#pragma acc atomic capture
|
|
LHS = --RHS;
|
|
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+2{{unary operator not supported, only increment and decrement operations permitted}}
|
|
#pragma acc atomic capture
|
|
LHS = +RHS;
|
|
|
|
#pragma acc atomic capture
|
|
LHS = RHS += 1 + RHS;
|
|
#pragma acc atomic capture
|
|
LHS = RHS *= 1 + RHS;
|
|
#pragma acc atomic capture
|
|
LHS = RHS -= 1 + RHS;
|
|
#pragma acc atomic capture
|
|
LHS = RHS /= 1 + RHS;
|
|
#pragma acc atomic capture
|
|
LHS = RHS &= 1 + RHS;
|
|
#pragma acc atomic capture
|
|
LHS = RHS ^= 1 + RHS;
|
|
#pragma acc atomic capture
|
|
LHS = RHS >>= 1 + RHS;
|
|
#pragma acc atomic capture
|
|
LHS = RHS |= 1 + RHS;
|
|
#pragma acc atomic capture
|
|
LHS = RHS <<= 1 + RHS;
|
|
#pragma acc atomic capture
|
|
LHS = RHS >>= 1 + RHS;
|
|
|
|
#pragma acc atomic capture
|
|
LHS = RHS ^= 1 + RHS;
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+2{{compound binary operator not supported, only +=, *=, -=, /=, &=, ^=, |=, <<=, or >>= are permitted}}
|
|
#pragma acc atomic capture
|
|
LHS = RHS <= 1 + RHS;
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+2{{compound binary operator not supported, only +=, *=, -=, /=, &=, ^=, |=, <<=, or >>= are permitted}}
|
|
#pragma acc atomic capture
|
|
LHS = RHS >= 1 + RHS;
|
|
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+2{{compound binary operator not supported, only +=, *=, -=, /=, &=, ^=, |=, <<=, or >>= are permitted}}
|
|
#pragma acc atomic capture
|
|
LHS = RHS + 1;
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+2{{compound binary operator not supported, only +=, *=, -=, /=, &=, ^=, |=, <<=, or >>= are permitted}}
|
|
#pragma acc atomic capture
|
|
LHS = RHS < 1 + RHS;
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+2{{compound binary operator not supported, only +=, *=, -=, /=, &=, ^=, |=, <<=, or >>= are permitted}}
|
|
#pragma acc atomic capture
|
|
LHS = RHS > 1 + RHS;
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+2{{compound binary operator not supported, only +=, *=, -=, /=, &=, ^=, |=, <<=, or >>= are permitted}}
|
|
#pragma acc atomic capture
|
|
LHS = RHS ^ 1 + RHS;
|
|
|
|
#pragma acc atomic capture
|
|
LHS = RHS = RHS + 1;
|
|
#pragma acc atomic capture
|
|
LHS = RHS = 1 + RHS;
|
|
#pragma acc atomic capture
|
|
LHS = RHS = RHS * 1;
|
|
#pragma acc atomic capture
|
|
LHS = RHS = 1 * RHS;
|
|
#pragma acc atomic capture
|
|
LHS = RHS = RHS / 1;
|
|
#pragma acc atomic capture
|
|
LHS = RHS = 1 / RHS;
|
|
#pragma acc atomic capture
|
|
LHS = RHS = RHS ^ 1;
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+2{{binary operator not supported, only +, *, -, /, &, ^, |, <<, or >> are permitted}}
|
|
#pragma acc atomic capture
|
|
LHS = RHS = 1 % RHS;
|
|
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+2{{binary operator not supported, only +, *, -, /, &, ^, |, <<, or >> are permitted}}
|
|
#pragma acc atomic capture
|
|
LHS = RHS = RHS < 1;
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+2{{binary operator not supported, only +, *, -, /, &, ^, |, <<, or >> are permitted}}
|
|
#pragma acc atomic capture
|
|
LHS = RHS = 1 > RHS;
|
|
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+2{{left hand side of assignment operation('LHS') must match one side of the sub-operation on the right hand side('RHS' and 'getRValue<T>()')}}
|
|
#pragma acc atomic capture
|
|
LHS = LHS = RHS + getRValue<T>();
|
|
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+2{{left hand side of assignment operation('LHS') must match one side of the sub-operation on the right hand side('getRValue<T>()' and 'RHS')}}
|
|
#pragma acc atomic capture
|
|
LHS = LHS = getRValue<T>() + RHS;
|
|
}
|
|
template<typename T>
|
|
void AtomicCaptureTemplateSimple2(T LHS, T RHS) {
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+2{{expected assignment expression}}
|
|
#pragma acc atomic capture
|
|
LHS++;
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+2{{expected assignment expression}}
|
|
#pragma acc atomic capture
|
|
--LHS;
|
|
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+2{{expected assignment expression}}
|
|
#pragma acc atomic capture
|
|
LHS += 1 + RHS;
|
|
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+2{{expected assignment, compound assignment, increment, or decrement expression}}
|
|
#pragma acc atomic capture
|
|
LHS = RHS;
|
|
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+2{{left operand to assignment expression must be of scalar type (was 'Struct')}}
|
|
#pragma acc atomic capture
|
|
LHS = RHS++;
|
|
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+2{{left operand to assignment expression must be of scalar type (was 'Struct')}}
|
|
#pragma acc atomic capture
|
|
LHS = RHS--;
|
|
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+2{{left operand to assignment expression must be of scalar type (was 'Struct')}}
|
|
#pragma acc atomic capture
|
|
LHS = ++RHS;
|
|
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+2{{left operand to assignment expression must be of scalar type (was 'Struct')}}
|
|
#pragma acc atomic capture
|
|
LHS = --RHS;
|
|
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+2{{unary operator not supported, only increment and decrement operations permitted}}
|
|
#pragma acc atomic capture
|
|
LHS = +RHS;
|
|
|
|
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+2{{left operand to assignment expression must be of scalar type (was 'Struct')}}
|
|
#pragma acc atomic capture
|
|
LHS = RHS += 1 + RHS;
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+2{{left operand to assignment expression must be of scalar type (was 'Struct')}}
|
|
#pragma acc atomic capture
|
|
LHS = RHS *= 1 + RHS;
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+2{{left operand to assignment expression must be of scalar type (was 'Struct')}}
|
|
#pragma acc atomic capture
|
|
LHS = RHS -= 1 + RHS;
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+2{{left operand to assignment expression must be of scalar type (was 'Struct')}}
|
|
#pragma acc atomic capture
|
|
LHS = RHS /= 1 + RHS;
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+2{{left operand to assignment expression must be of scalar type (was 'Struct')}}
|
|
#pragma acc atomic capture
|
|
LHS = RHS &= 1 + RHS;
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+2{{left operand to assignment expression must be of scalar type (was 'Struct')}}
|
|
#pragma acc atomic capture
|
|
LHS = RHS ^= 1 + RHS;
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+2{{left operand to assignment expression must be of scalar type (was 'Struct')}}
|
|
#pragma acc atomic capture
|
|
LHS = RHS >>= 1 + RHS;
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+2{{left operand to assignment expression must be of scalar type (was 'Struct')}}
|
|
#pragma acc atomic capture
|
|
LHS = RHS |= 1 + RHS;
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+2{{left operand to assignment expression must be of scalar type (was 'Struct')}}
|
|
#pragma acc atomic capture
|
|
LHS = RHS <<= 1 + RHS;
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+2{{left operand to assignment expression must be of scalar type (was 'Struct')}}
|
|
#pragma acc atomic capture
|
|
LHS = RHS >>= 1 + RHS;
|
|
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+2{{left operand to assignment expression must be of scalar type (was 'Struct')}}
|
|
#pragma acc atomic capture
|
|
LHS = RHS ^= 1 + RHS;
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+2{{compound binary operator not supported, only +=, *=, -=, /=, &=, ^=, |=, <<=, or >>= are permitted}}
|
|
#pragma acc atomic capture
|
|
LHS = RHS <= 1 + RHS;
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+2{{compound binary operator not supported, only +=, *=, -=, /=, &=, ^=, |=, <<=, or >>= are permitted}}
|
|
#pragma acc atomic capture
|
|
LHS = RHS >= 1 + RHS;
|
|
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+2{{compound binary operator not supported, only +=, *=, -=, /=, &=, ^=, |=, <<=, or >>= are permitted}}
|
|
#pragma acc atomic capture
|
|
LHS = RHS + 1;
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+2{{compound binary operator not supported, only +=, *=, -=, /=, &=, ^=, |=, <<=, or >>= are permitted}}
|
|
#pragma acc atomic capture
|
|
LHS = RHS < 1 + RHS;
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+2{{compound binary operator not supported, only +=, *=, -=, /=, &=, ^=, |=, <<=, or >>= are permitted}}
|
|
#pragma acc atomic capture
|
|
LHS = RHS > 1 + RHS;
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+2{{compound binary operator not supported, only +=, *=, -=, /=, &=, ^=, |=, <<=, or >>= are permitted}}
|
|
#pragma acc atomic capture
|
|
LHS = RHS ^ 1 + RHS;
|
|
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+2{{left operand to assignment expression must be of scalar type (was 'Struct')}}
|
|
#pragma acc atomic capture
|
|
LHS = RHS = RHS + 1;
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+2{{left operand to assignment expression must be of scalar type (was 'Struct')}}
|
|
#pragma acc atomic capture
|
|
LHS = RHS = 1 + RHS;
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+2{{left operand to assignment expression must be of scalar type (was 'Struct')}}
|
|
#pragma acc atomic capture
|
|
LHS = RHS = RHS * 1;
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+2{{left operand to assignment expression must be of scalar type (was 'Struct')}}
|
|
#pragma acc atomic capture
|
|
LHS = RHS = 1 * RHS;
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+2{{left operand to assignment expression must be of scalar type (was 'Struct')}}
|
|
#pragma acc atomic capture
|
|
LHS = RHS = RHS / 1;
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+2{{left operand to assignment expression must be of scalar type (was 'Struct')}}
|
|
#pragma acc atomic capture
|
|
LHS = RHS = 1 / RHS;
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+2{{left operand to assignment expression must be of scalar type (was 'Struct')}}
|
|
#pragma acc atomic capture
|
|
LHS = RHS = RHS ^ 1;
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+2{{binary operator not supported, only +, *, -, /, &, ^, |, <<, or >> are permitted}}
|
|
#pragma acc atomic capture
|
|
LHS = RHS = 1 % RHS;
|
|
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+2{{binary operator not supported, only +, *, -, /, &, ^, |, <<, or >> are permitted}}
|
|
#pragma acc atomic capture
|
|
LHS = RHS = RHS < 1;
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+2{{binary operator not supported, only +, *, -, /, &, ^, |, <<, or >> are permitted}}
|
|
#pragma acc atomic capture
|
|
LHS = RHS = 1 > RHS;
|
|
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+2{{left hand side of assignment operation('LHS') must match one side of the sub-operation on the right hand side('RHS' and 'getRValue<T>()')}}
|
|
#pragma acc atomic capture
|
|
LHS = LHS = RHS + getRValue<T>();
|
|
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+2{{left hand side of assignment operation('LHS') must match one side of the sub-operation on the right hand side('getRValue<T>()' and 'RHS')}}
|
|
#pragma acc atomic capture
|
|
LHS = LHS = getRValue<T>() + RHS;
|
|
}
|
|
|
|
void AtomicCaptureSimple(int LHS, int RHS) {
|
|
AtomicCaptureTemplateSimple(1, 2);
|
|
AtomicCaptureTemplateSimple2(S1, S2); //expected-note{{in instantiation of function template specialization}}
|
|
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+2{{expected assignment expression}}
|
|
#pragma acc atomic capture
|
|
LHS++;
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+2{{expected assignment expression}}
|
|
#pragma acc atomic capture
|
|
--LHS;
|
|
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+2{{expected assignment expression}}
|
|
#pragma acc atomic capture
|
|
LHS += 1 + RHS;
|
|
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+2{{expected assignment, compound assignment, increment, or decrement expression}}
|
|
#pragma acc atomic capture
|
|
LHS = RHS;
|
|
|
|
#pragma acc atomic capture
|
|
LHS = RHS++;
|
|
|
|
#pragma acc atomic capture
|
|
LHS = RHS--;
|
|
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+2{{left operand to assignment expression must be of scalar type (was 'Struct')}}
|
|
#pragma acc atomic capture
|
|
S1 = ++S2;
|
|
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+2{{left operand to assignment expression must be of scalar type (was 'Struct')}}
|
|
#pragma acc atomic capture
|
|
S1 = --S2 ;
|
|
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+2{{unary operator not supported, only increment and decrement operations permitted}}
|
|
#pragma acc atomic capture
|
|
LHS = +RHS;
|
|
|
|
#pragma acc atomic capture
|
|
LHS = RHS += 1 + RHS;
|
|
#pragma acc atomic capture
|
|
LHS = RHS *= 1 + RHS;
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+2{{left operand to assignment expression must be of scalar type (was 'Struct')}}
|
|
#pragma acc atomic capture
|
|
S1 = RHS -= 1 + RHS;
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+2{{expected assignment, compound assignment, increment, or decrement expression}}
|
|
#pragma acc atomic capture
|
|
LHS = S1 /= 1 + RHS;
|
|
#pragma acc atomic capture
|
|
LHS = RHS &= 1 + S2;
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+2{{expected assignment, compound assignment, increment, or decrement expression}}
|
|
#pragma acc atomic capture
|
|
LHS = S1^= 1 + S2;
|
|
|
|
#pragma acc atomic capture
|
|
LHS = RHS ^= 1 + RHS;
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+2{{compound binary operator not supported, only +=, *=, -=, /=, &=, ^=, |=, <<=, or >>= are permitted}}
|
|
#pragma acc atomic capture
|
|
LHS = RHS <= 1 + RHS;
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+2{{left operand to assignment expression must be of scalar type (was 'Struct')}}
|
|
#pragma acc atomic capture
|
|
S1 = RHS ^= 1 + RHS;
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+2{{compound binary operator not supported, only +=, *=, -=, /=, &=, ^=, |=, <<=, or >>= are permitted}}
|
|
#pragma acc atomic capture
|
|
LHS = S1 <= 1 + RHS;
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+2{{compound binary operator not supported, only +=, *=, -=, /=, &=, ^=, |=, <<=, or >>= are permitted}}
|
|
#pragma acc atomic capture
|
|
LHS = RHS <= 1 + S2;
|
|
|
|
#pragma acc atomic capture
|
|
LHS = RHS = RHS + 1;
|
|
#pragma acc atomic capture
|
|
LHS = RHS = 1 + RHS;
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+2{{left operand to assignment expression must be of scalar type (was 'Struct')}}
|
|
#pragma acc atomic capture
|
|
S1 = RHS = RHS * 1;
|
|
// A little weird, because this contains a 'operator int' call here rather
|
|
// than a conversion, so the diagnostic could be better.
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+2{{expected assignment, compound assignment, increment, or decrement expression}}
|
|
#pragma acc atomic capture
|
|
LHS = S2 = 1 * S2;
|
|
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+2{{binary operator not supported, only +, *, -, /, &, ^, |, <<, or >> are permitted}}
|
|
#pragma acc atomic capture
|
|
LHS = RHS = RHS < 1;
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+2{{binary operator not supported, only +, *, -, /, &, ^, |, <<, or >> are permitted}}
|
|
#pragma acc atomic capture
|
|
LHS = RHS = 1 > RHS;
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+2{{left operand to assignment expression must be of scalar type (was 'Struct')}}
|
|
#pragma acc atomic capture
|
|
S1 = RHS = RHS < 1;
|
|
|
|
// A little weird, because this contains a 'operator int' call here rather
|
|
// than a conversion, so the diagnostic could be better.
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+2{{expected assignment, compound assignment, increment, or decrement expression}}
|
|
#pragma acc atomic capture
|
|
LHS = S1 = 1 > S1;
|
|
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+2{{left hand side of assignment operation('LHS') must match one side of the sub-operation on the right hand side('RHS' and 'getRValue<int>()')}}
|
|
#pragma acc atomic capture
|
|
LHS = LHS = RHS + getRValue<int>();
|
|
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+2{{left hand side of assignment operation('LHS') must match one side of the sub-operation on the right hand side('getRValue<int>()' and 'RHS')}}
|
|
#pragma acc atomic capture
|
|
LHS = LHS = getRValue<int>() + RHS;
|
|
}
|
|
|
|
template<typename T>
|
|
void AtomicCaptureTemplateCompound(T LHS, T RHS) {
|
|
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+2{{expected assignment, compound assignment, increment, or decrement expression}}
|
|
#pragma acc atomic capture
|
|
{
|
|
}
|
|
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+4{{expected assignment, compound assignment, increment, or decrement expression}}
|
|
#pragma acc atomic capture
|
|
{
|
|
LHS = RHS;
|
|
}
|
|
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+3{{'atomic capture' with a compound statement only supports two statements}}
|
|
#pragma acc atomic capture
|
|
{
|
|
LHS = RHS; RHS += 1; LHS=RHS;
|
|
}
|
|
|
|
|
|
#pragma acc atomic capture
|
|
{
|
|
LHS++;
|
|
RHS = LHS;
|
|
}
|
|
|
|
#pragma acc atomic capture
|
|
{
|
|
++LHS;
|
|
RHS = LHS;
|
|
}
|
|
|
|
#pragma acc atomic capture
|
|
{
|
|
--LHS;
|
|
RHS = LHS;
|
|
}
|
|
|
|
|
|
#pragma acc atomic capture
|
|
{
|
|
LHS--;
|
|
// expected-error@-3{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+1{{variable on right hand side of assignment('RHS') must match variable used in unary expression('LHS') from the first statement}}
|
|
LHS = RHS;
|
|
}
|
|
|
|
#pragma acc atomic capture
|
|
{
|
|
// expected-error@-2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+1{{unary operator not supported, only increment and decrement operations permitted}}
|
|
-LHS;
|
|
RHS = LHS;
|
|
}
|
|
|
|
#pragma acc atomic capture
|
|
{
|
|
--LHS;
|
|
// expected-error@-3{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+1{{expected assignment expression}}
|
|
RHS += LHS;
|
|
}
|
|
|
|
// { x binop = expr; v = x; }
|
|
#pragma acc atomic capture
|
|
{
|
|
LHS += 1;
|
|
RHS = LHS;
|
|
}
|
|
#pragma acc atomic capture
|
|
{
|
|
LHS *= 1;
|
|
// expected-error@-3{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+1{{variable on right hand side of assignment('RHS') must match variable used on left hand side of compound assignment('LHS') from the first statement}}
|
|
LHS = RHS;
|
|
}
|
|
#pragma acc atomic capture
|
|
{
|
|
LHS /= 1;
|
|
// expected-error@-3{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+1{{expected assignment expression}}
|
|
RHS += LHS;
|
|
}
|
|
|
|
// { x = x binop expr; v = x; }
|
|
#pragma acc atomic capture
|
|
{
|
|
LHS = LHS + 1;
|
|
RHS = LHS;
|
|
}
|
|
|
|
#pragma acc atomic capture
|
|
{
|
|
// expected-error@-2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+1{{left hand side of assignment operation('LHS') must match one side of the sub-operation on the right hand side('RHS' and '1')}}
|
|
LHS = RHS - 1;
|
|
RHS = LHS;
|
|
}
|
|
#pragma acc atomic capture
|
|
{
|
|
LHS = LHS * 1;
|
|
// expected-error@-3{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+1{{variable on right hand side of assignment('RHS') must match variable used on left hand side of assignment('LHS') from the first statement}}
|
|
RHS = RHS;
|
|
}
|
|
#pragma acc atomic capture
|
|
{
|
|
LHS = LHS / 1;
|
|
// expected-error@-3{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+1{{expected assignment expression}}
|
|
RHS += LHS;
|
|
}
|
|
|
|
// { x = expr binop x; v = x; }
|
|
#pragma acc atomic capture
|
|
{
|
|
LHS = 1 ^ LHS;
|
|
RHS = LHS;
|
|
}
|
|
|
|
#pragma acc atomic capture
|
|
{
|
|
// expected-error@-2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+1{{left hand side of assignment operation('LHS') must match one side of the sub-operation on the right hand side('1' and 'RHS')}}
|
|
LHS = 1 & RHS;
|
|
RHS = LHS;
|
|
}
|
|
#pragma acc atomic capture
|
|
{
|
|
LHS = LHS | 1;
|
|
// expected-error@-3{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+1{{variable on right hand side of assignment('RHS') must match variable used on left hand side of assignment('LHS') from the first statement}}
|
|
RHS = RHS;
|
|
}
|
|
#pragma acc atomic capture
|
|
{
|
|
LHS = LHS << 1;
|
|
// expected-error@-3{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+1{{expected assignment expression}}
|
|
RHS += LHS;
|
|
}
|
|
|
|
// { v = x; x binop = expr; }
|
|
#pragma acc atomic capture
|
|
{
|
|
LHS = RHS;
|
|
RHS += 1;
|
|
}
|
|
|
|
// { v = x; x = x binop expr; }
|
|
#pragma acc atomic capture
|
|
{
|
|
LHS = RHS;
|
|
RHS = RHS / 1;
|
|
}
|
|
#pragma acc atomic capture
|
|
{
|
|
LHS = RHS;
|
|
// expected-error@-3{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+1{{left hand side of assignment operation('RHS') must match one side of the sub-operation on the right hand side('LHS' and '1')}}
|
|
RHS = LHS ^ 1;
|
|
}
|
|
#pragma acc atomic capture
|
|
{
|
|
LHS = RHS;
|
|
// expected-error@-3{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+1{{left hand side of assignment operation('LHS') must match one side of the sub-operation on the right hand side('RHS' and '1')}}
|
|
LHS = RHS << 1;
|
|
}
|
|
// { v = x; x = expr binop x; }
|
|
#pragma acc atomic capture
|
|
{
|
|
LHS = RHS;
|
|
RHS = 1 / RHS;
|
|
}
|
|
#pragma acc atomic capture
|
|
{
|
|
LHS = RHS;
|
|
// expected-error@-3{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+1{{left hand side of assignment operation('RHS') must match one side of the sub-operation on the right hand side('1' and 'LHS')}}
|
|
RHS = 1 ^ LHS;
|
|
}
|
|
#pragma acc atomic capture
|
|
{
|
|
LHS = RHS;
|
|
// expected-error@-3{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+1{{left hand side of assignment operation('LHS') must match one side of the sub-operation on the right hand side('1' and 'RHS')}}
|
|
LHS = 1 << RHS;
|
|
}
|
|
|
|
// { v = x; x = expr; }
|
|
#pragma acc atomic capture
|
|
{
|
|
LHS = RHS;
|
|
RHS = 1;
|
|
}
|
|
#pragma acc atomic capture
|
|
{
|
|
LHS = RHS;
|
|
// expected-error@-3{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+1{{variable on left hand side of assignment('LHS') must match variable used on right hand side of assignment('RHS') from the first statement}}
|
|
LHS = 1;
|
|
}
|
|
|
|
// { v = x; x++; }
|
|
// { v = x; ++x; }
|
|
// { v = x; x--; }
|
|
// { v = x; --x; }
|
|
#pragma acc atomic capture
|
|
{
|
|
LHS = RHS;
|
|
RHS++;
|
|
}
|
|
#pragma acc atomic capture
|
|
{
|
|
LHS = RHS;
|
|
RHS--;
|
|
}
|
|
#pragma acc atomic capture
|
|
{
|
|
LHS = RHS;
|
|
++RHS;
|
|
}
|
|
#pragma acc atomic capture
|
|
{
|
|
LHS = RHS;
|
|
--RHS;
|
|
}
|
|
#pragma acc atomic capture
|
|
{
|
|
LHS = RHS;
|
|
// expected-error@-3{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+1{{unary operator not supported, only increment and decrement operations permitted}}
|
|
-RHS;
|
|
}
|
|
#pragma acc atomic capture
|
|
{
|
|
LHS = RHS;
|
|
// expected-error@-3{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+1{{variable in unary expression('LHS') must match variable used on right hand side of assignment('RHS') from the first statement}}
|
|
LHS++;
|
|
}
|
|
}
|
|
|
|
template<typename T>
|
|
void AtomicCaptureTemplateCompound2(T LHS, T RHS) {
|
|
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+2{{expected assignment, compound assignment, increment, or decrement expression}}
|
|
#pragma acc atomic capture
|
|
{
|
|
}
|
|
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+4{{expected assignment, compound assignment, increment, or decrement expression}}
|
|
#pragma acc atomic capture
|
|
{
|
|
LHS = RHS;
|
|
}
|
|
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+3{{'atomic capture' with a compound statement only supports two statements}}
|
|
#pragma acc atomic capture
|
|
{
|
|
LHS = RHS; RHS += 1; LHS=RHS;
|
|
}
|
|
|
|
|
|
#pragma acc atomic capture
|
|
{
|
|
// expected-error@-2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+1{{operand to increment expression must be of scalar type (was 'Struct')}}
|
|
LHS++;
|
|
RHS = LHS;
|
|
}
|
|
|
|
#pragma acc atomic capture
|
|
{
|
|
// expected-error@-2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+1{{operand to increment expression must be of scalar type (was 'Struct')}}
|
|
++LHS;
|
|
RHS = LHS;
|
|
}
|
|
|
|
#pragma acc atomic capture
|
|
{
|
|
// expected-error@-2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+1{{operand to decrement expression must be of scalar type (was 'Struct')}}
|
|
--LHS;
|
|
RHS = LHS;
|
|
}
|
|
|
|
|
|
#pragma acc atomic capture
|
|
{
|
|
LHS--;
|
|
// expected-error@-3{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+1{{variable on right hand side of assignment('RHS') must match variable used in unary expression('LHS') from the first statement}}
|
|
LHS = RHS;
|
|
}
|
|
|
|
#pragma acc atomic capture
|
|
{
|
|
// expected-error@-2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+1{{unary operator not supported, only increment and decrement operations permitted}}
|
|
-LHS;
|
|
RHS = LHS;
|
|
}
|
|
|
|
#pragma acc atomic capture
|
|
{
|
|
--LHS;
|
|
// expected-error@-3{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+1{{expected assignment expression}}
|
|
RHS += LHS;
|
|
}
|
|
|
|
// { x binop = expr; v = x; }
|
|
#pragma acc atomic capture
|
|
{
|
|
// expected-error@-2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+1{{left operand to compound assignment expression must be of scalar type (was 'Struct')}}
|
|
LHS += 1;
|
|
RHS = LHS;
|
|
}
|
|
#pragma acc atomic capture
|
|
{
|
|
LHS *= 1;
|
|
// expected-error@-3{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+1{{variable on right hand side of assignment('RHS') must match variable used on left hand side of compound assignment('LHS') from the first statement}}
|
|
LHS = RHS;
|
|
}
|
|
#pragma acc atomic capture
|
|
{
|
|
LHS /= 1;
|
|
// expected-error@-3{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+1{{expected assignment expression}}
|
|
RHS += LHS;
|
|
}
|
|
|
|
// { x = x binop expr; v = x; }
|
|
#pragma acc atomic capture
|
|
{
|
|
// expected-error@-2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+1{{left operand to assignment expression must be of scalar type (was 'Struct')}}
|
|
LHS = LHS + 1;
|
|
RHS = LHS;
|
|
}
|
|
|
|
#pragma acc atomic capture
|
|
{
|
|
// expected-error@-2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+1{{left hand side of assignment operation('LHS') must match one side of the sub-operation on the right hand side('RHS' and '1')}}
|
|
LHS = RHS - 1;
|
|
RHS = LHS;
|
|
}
|
|
#pragma acc atomic capture
|
|
{
|
|
LHS = LHS * 1;
|
|
// expected-error@-3{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+1{{variable on right hand side of assignment('RHS') must match variable used on left hand side of assignment('LHS') from the first statement}}
|
|
RHS = RHS;
|
|
}
|
|
#pragma acc atomic capture
|
|
{
|
|
LHS = LHS / 1;
|
|
// expected-error@-3{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+1{{expected assignment expression}}
|
|
RHS += LHS;
|
|
}
|
|
|
|
// { x = expr binop x; v = x; }
|
|
#pragma acc atomic capture
|
|
{
|
|
// expected-error@-2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+1{{left operand to assignment expression must be of scalar type (was 'Struct')}}
|
|
LHS = 1 ^ LHS;
|
|
RHS = LHS;
|
|
}
|
|
|
|
#pragma acc atomic capture
|
|
{
|
|
// expected-error@-2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+1{{left hand side of assignment operation('LHS') must match one side of the sub-operation on the right hand side('1' and 'RHS')}}
|
|
LHS = 1 & RHS;
|
|
RHS = LHS;
|
|
}
|
|
#pragma acc atomic capture
|
|
{
|
|
LHS = LHS | 1;
|
|
// expected-error@-3{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+1{{variable on right hand side of assignment('RHS') must match variable used on left hand side of assignment('LHS') from the first statement}}
|
|
RHS = RHS;
|
|
}
|
|
#pragma acc atomic capture
|
|
{
|
|
LHS = LHS << 1;
|
|
// expected-error@-3{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+1{{expected assignment expression}}
|
|
RHS += LHS;
|
|
}
|
|
|
|
// { v = x; x binop = expr; }
|
|
#pragma acc atomic capture
|
|
{
|
|
// expected-error@-2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+1{{left operand to assignment expression must be of scalar type (was 'Struct')}}
|
|
LHS = RHS;
|
|
RHS += 1;
|
|
}
|
|
|
|
// { v = x; x = x binop expr; }
|
|
#pragma acc atomic capture
|
|
{
|
|
// expected-error@-2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+1{{left operand to assignment expression must be of scalar type (was 'Struct')}}
|
|
LHS = RHS;
|
|
RHS = RHS / 1;
|
|
}
|
|
#pragma acc atomic capture
|
|
{
|
|
LHS = RHS;
|
|
// expected-error@-3{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+1{{left hand side of assignment operation('RHS') must match one side of the sub-operation on the right hand side('LHS' and '1')}}
|
|
RHS = LHS ^ 1;
|
|
}
|
|
#pragma acc atomic capture
|
|
{
|
|
LHS = RHS;
|
|
// expected-error@-3{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+1{{left hand side of assignment operation('LHS') must match one side of the sub-operation on the right hand side('RHS' and '1')}}
|
|
LHS = RHS << 1;
|
|
}
|
|
// { v = x; x = expr binop x; }
|
|
#pragma acc atomic capture
|
|
{
|
|
// expected-error@-2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+1{{left operand to assignment expression must be of scalar type (was 'Struct')}}
|
|
LHS = RHS;
|
|
RHS = 1 / RHS;
|
|
}
|
|
#pragma acc atomic capture
|
|
{
|
|
LHS = RHS;
|
|
// expected-error@-3{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+1{{left hand side of assignment operation('RHS') must match one side of the sub-operation on the right hand side('1' and 'LHS')}}
|
|
RHS = 1 ^ LHS;
|
|
}
|
|
#pragma acc atomic capture
|
|
{
|
|
LHS = RHS;
|
|
// expected-error@-3{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+1{{left hand side of assignment operation('LHS') must match one side of the sub-operation on the right hand side('1' and 'RHS')}}
|
|
LHS = 1 << RHS;
|
|
}
|
|
|
|
// { v = x; x = expr; }
|
|
#pragma acc atomic capture
|
|
{
|
|
// expected-error@-2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+1{{left operand to assignment expression must be of scalar type (was 'Struct')}}
|
|
LHS = RHS;
|
|
RHS = 1;
|
|
}
|
|
#pragma acc atomic capture
|
|
{
|
|
LHS = RHS;
|
|
// expected-error@-3{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+1{{variable on left hand side of assignment('LHS') must match variable used on right hand side of assignment('RHS') from the first statement}}
|
|
LHS = 1;
|
|
}
|
|
|
|
// { v = x; x++; }
|
|
// { v = x; ++x; }
|
|
// { v = x; x--; }
|
|
// { v = x; --x; }
|
|
#pragma acc atomic capture
|
|
{
|
|
// expected-error@-2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+1{{left operand to assignment expression must be of scalar type (was 'Struct')}}
|
|
LHS = RHS;
|
|
RHS++;
|
|
}
|
|
#pragma acc atomic capture
|
|
{
|
|
// expected-error@-2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+1{{left operand to assignment expression must be of scalar type (was 'Struct')}}
|
|
LHS = RHS;
|
|
RHS--;
|
|
}
|
|
#pragma acc atomic capture
|
|
{
|
|
// expected-error@-2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+1{{left operand to assignment expression must be of scalar type (was 'Struct')}}
|
|
LHS = RHS;
|
|
++RHS;
|
|
}
|
|
#pragma acc atomic capture
|
|
{
|
|
// expected-error@-2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+1{{left operand to assignment expression must be of scalar type (was 'Struct')}}
|
|
LHS = RHS;
|
|
--RHS;
|
|
}
|
|
#pragma acc atomic capture
|
|
{
|
|
LHS = RHS;
|
|
// expected-error@-3{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+1{{unary operator not supported, only increment and decrement operations permitted}}
|
|
-RHS;
|
|
}
|
|
#pragma acc atomic capture
|
|
{
|
|
LHS = RHS;
|
|
// expected-error@-3{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+1{{variable in unary expression('LHS') must match variable used on right hand side of assignment('RHS') from the first statement}}
|
|
LHS++;
|
|
}
|
|
}
|
|
void AtomicCaptureCompound(int LHS, int RHS) {
|
|
AtomicCaptureTemplateCompound(1, 2);
|
|
AtomicCaptureTemplateCompound2(S1, S2); //expected-note{{in instantiation of function template specialization}}
|
|
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+2{{expected assignment, compound assignment, increment, or decrement expression}}
|
|
#pragma acc atomic capture
|
|
{
|
|
}
|
|
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+4{{expected assignment, compound assignment, increment, or decrement expression}}
|
|
#pragma acc atomic capture
|
|
{
|
|
LHS = RHS;
|
|
}
|
|
|
|
// expected-error@+2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+3{{'atomic capture' with a compound statement only supports two statements}}
|
|
#pragma acc atomic capture
|
|
{
|
|
LHS = RHS; RHS += 1; LHS=RHS;
|
|
}
|
|
|
|
|
|
#pragma acc atomic capture
|
|
{
|
|
LHS++;
|
|
RHS = LHS;
|
|
}
|
|
#pragma acc atomic capture
|
|
{
|
|
// expected-error@-2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+1{{operand to increment expression must be of scalar type (was 'Struct')}}
|
|
S1++;
|
|
S2= S1;
|
|
}
|
|
|
|
#pragma acc atomic capture
|
|
{
|
|
++LHS;
|
|
RHS = LHS;
|
|
}
|
|
|
|
#pragma acc atomic capture
|
|
{
|
|
--LHS;
|
|
RHS = LHS;
|
|
}
|
|
|
|
|
|
#pragma acc atomic capture
|
|
{
|
|
LHS--;
|
|
// expected-error@-3{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+1{{variable on right hand side of assignment('RHS') must match variable used in unary expression('LHS') from the first statement}}
|
|
LHS = RHS;
|
|
}
|
|
|
|
#pragma acc atomic capture
|
|
{
|
|
// expected-error@-2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+1{{unary operator not supported, only increment and decrement operations permitted}}
|
|
-LHS;
|
|
RHS = LHS;
|
|
}
|
|
|
|
#pragma acc atomic capture
|
|
{
|
|
--LHS;
|
|
// expected-error@-3{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+1{{expected assignment expression}}
|
|
RHS += LHS;
|
|
}
|
|
|
|
// { x binop = expr; v = x; }
|
|
#pragma acc atomic capture
|
|
{
|
|
LHS += 1;
|
|
RHS = LHS;
|
|
}
|
|
#pragma acc atomic capture
|
|
{
|
|
// expected-error@-2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+1{{left operand to compound assignment expression must be of scalar type (was 'Struct')}}
|
|
S1 += 1;
|
|
S2= S1;
|
|
}
|
|
#pragma acc atomic capture
|
|
{
|
|
LHS *= 1;
|
|
// expected-error@-3{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+1{{variable on right hand side of assignment('RHS') must match variable used on left hand side of compound assignment('LHS') from the first statement}}
|
|
LHS = RHS;
|
|
}
|
|
#pragma acc atomic capture
|
|
{
|
|
LHS /= 1;
|
|
// expected-error@-3{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+1{{expected assignment expression}}
|
|
RHS += LHS;
|
|
}
|
|
|
|
// { x = x binop expr; v = x; }
|
|
#pragma acc atomic capture
|
|
{
|
|
LHS = LHS + 1;
|
|
RHS = LHS;
|
|
}
|
|
#pragma acc atomic capture
|
|
{
|
|
// expected-error@-2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+1{{left operand to assignment expression must be of scalar type (was 'Struct')}}
|
|
S1 = S1 + 1;
|
|
S2= S1;
|
|
}
|
|
|
|
#pragma acc atomic capture
|
|
{
|
|
// expected-error@-2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+1{{left hand side of assignment operation('LHS') must match one side of the sub-operation on the right hand side('RHS' and '1')}}
|
|
LHS = RHS - 1;
|
|
RHS = LHS;
|
|
}
|
|
#pragma acc atomic capture
|
|
{
|
|
LHS = LHS * 1;
|
|
// expected-error@-3{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+1{{variable on right hand side of assignment('RHS') must match variable used on left hand side of assignment('LHS') from the first statement}}
|
|
RHS = RHS;
|
|
}
|
|
#pragma acc atomic capture
|
|
{
|
|
LHS = LHS / 1;
|
|
// expected-error@-3{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+1{{expected assignment expression}}
|
|
RHS += LHS;
|
|
}
|
|
|
|
// { x = expr binop x; v = x; }
|
|
#pragma acc atomic capture
|
|
{
|
|
LHS = 1 ^ LHS;
|
|
RHS = LHS;
|
|
}
|
|
#pragma acc atomic capture
|
|
{
|
|
// expected-error@-2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+1{{left operand to assignment expression must be of scalar type (was 'Struct')}}
|
|
S1 = 1 ^ S1;
|
|
S2 = S1;
|
|
}
|
|
|
|
#pragma acc atomic capture
|
|
{
|
|
// expected-error@-2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+1{{left hand side of assignment operation('LHS') must match one side of the sub-operation on the right hand side('1' and 'RHS')}}
|
|
LHS = 1 & RHS;
|
|
RHS = LHS;
|
|
}
|
|
#pragma acc atomic capture
|
|
{
|
|
LHS = LHS | 1;
|
|
// expected-error@-3{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+1{{variable on right hand side of assignment('RHS') must match variable used on left hand side of assignment('LHS') from the first statement}}
|
|
RHS = RHS;
|
|
}
|
|
#pragma acc atomic capture
|
|
{
|
|
LHS = LHS << 1;
|
|
// expected-error@-3{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+1{{expected assignment expression}}
|
|
RHS += LHS;
|
|
}
|
|
|
|
// { v = x; x binop = expr; }
|
|
#pragma acc atomic capture
|
|
{
|
|
LHS = RHS;
|
|
RHS += 1;
|
|
}
|
|
|
|
#pragma acc atomic capture
|
|
{
|
|
// expected-error@-2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+1{{left operand to assignment expression must be of scalar type (was 'Struct')}}
|
|
S1 = S2;
|
|
S2 += 1;
|
|
}
|
|
|
|
// { v = x; x = x binop expr; }
|
|
#pragma acc atomic capture
|
|
{
|
|
LHS = RHS;
|
|
RHS = RHS / 1;
|
|
}
|
|
#pragma acc atomic capture
|
|
{
|
|
LHS = RHS;
|
|
// expected-error@-3{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+1{{left hand side of assignment operation('RHS') must match one side of the sub-operation on the right hand side('LHS' and '1')}}
|
|
RHS = LHS ^ 1;
|
|
}
|
|
#pragma acc atomic capture
|
|
{
|
|
LHS = RHS;
|
|
// expected-error@-3{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+1{{left hand side of assignment operation('LHS') must match one side of the sub-operation on the right hand side('RHS' and '1')}}
|
|
LHS = RHS << 1;
|
|
}
|
|
// { v = x; x = expr binop x; }
|
|
#pragma acc atomic capture
|
|
{
|
|
LHS = RHS;
|
|
RHS = 1 / RHS;
|
|
}
|
|
#pragma acc atomic capture
|
|
{
|
|
LHS = RHS;
|
|
// expected-error@-3{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+1{{left hand side of assignment operation('RHS') must match one side of the sub-operation on the right hand side('1' and 'LHS')}}
|
|
RHS = 1 ^ LHS;
|
|
}
|
|
#pragma acc atomic capture
|
|
{
|
|
LHS = RHS;
|
|
// expected-error@-3{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+1{{left hand side of assignment operation('LHS') must match one side of the sub-operation on the right hand side('1' and 'RHS')}}
|
|
LHS = 1 << RHS;
|
|
}
|
|
|
|
// { v = x; x = expr; }
|
|
#pragma acc atomic capture
|
|
{
|
|
LHS = RHS;
|
|
RHS = 1;
|
|
}
|
|
#pragma acc atomic capture
|
|
{
|
|
LHS = RHS;
|
|
// expected-error@-3{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+1{{variable on left hand side of assignment('LHS') must match variable used on right hand side of assignment('RHS') from the first statement}}
|
|
LHS = 1;
|
|
}
|
|
|
|
// { v = x; x++; }
|
|
// { v = x; ++x; }
|
|
// { v = x; x--; }
|
|
// { v = x; --x; }
|
|
#pragma acc atomic capture
|
|
{
|
|
LHS = RHS;
|
|
RHS++;
|
|
}
|
|
#pragma acc atomic capture
|
|
{
|
|
LHS = RHS;
|
|
RHS--;
|
|
}
|
|
#pragma acc atomic capture
|
|
{
|
|
LHS = RHS;
|
|
++RHS;
|
|
}
|
|
#pragma acc atomic capture
|
|
{
|
|
LHS = RHS;
|
|
--RHS;
|
|
}
|
|
#pragma acc atomic capture
|
|
{
|
|
// expected-error@-2{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+1{{left operand to assignment expression must be of scalar type (was 'Struct')}}
|
|
S1= S2;
|
|
--S2;
|
|
}
|
|
#pragma acc atomic capture
|
|
{
|
|
LHS = RHS;
|
|
// expected-error@-3{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+1{{unary operator not supported, only increment and decrement operations permitted}}
|
|
-RHS;
|
|
}
|
|
#pragma acc atomic capture
|
|
{
|
|
LHS = RHS;
|
|
// expected-error@-3{{statement associated with OpenACC 'atomic capture' directive is invalid}}
|
|
// expected-note@+1{{variable in unary expression('LHS') must match variable used on right hand side of assignment('RHS') from the first statement}}
|
|
LHS++;
|
|
}
|
|
}
|