"parent region for 'omp %select{cancellation point/cancel}0' construct cannot be ordered">;
def err_omp_wrong_linear_modifier : Error<
"expected %select{'val' modifier|one of 'ref', val' or 'uval' modifiers}0">;
+def err_omp_wrong_linear_modifier_non_reference : Error<
+ "variable of non-reference type %0 can be used only with 'val' modifier, but used with '%1'">;
} // end of OpenMP category
let CategoryName = "Related Result Type Issue" in {
} else if (Kind == OMPC_linear) {
// Try to parse modifier if any.
if (Tok.is(tok::identifier) && PP.LookAhead(0).is(tok::l_paren)) {
- StringRef TokSpelling = PP.getSpelling(Tok);
LinearModifier = static_cast<OpenMPLinearClauseKind>(
- getOpenMPSimpleClauseType(Kind, TokSpelling));
+ getOpenMPSimpleClauseType(Kind, PP.getSpelling(Tok)));
DepLinLoc = ConsumeToken();
LinearT.consumeOpen();
NeedRParenForLinear = true;
diag::err_omp_linear_incomplete_type)) {
continue;
}
+ if ((LinKind == OMPC_LINEAR_uval || LinKind == OMPC_LINEAR_ref) &&
+ !QType->isReferenceType()) {
+ Diag(ELoc, diag::err_omp_wrong_linear_modifier_non_reference)
+ << QType << getOpenMPSimpleClauseTypeName(OMPC_linear, LinKind);
+ continue;
+ }
QType = QType.getNonReferenceType();
// A list item must not be const-qualified.
for (int k = 0; k < argc; ++k) ++k;
#pragma omp simd linear (argv[1]) // expected-error {{expected variable name}}
for (int k = 0; k < argc; ++k) ++k;
- #pragma omp simd linear(ref(e, g))
+ #pragma omp simd linear(ref(e, g)) // expected-error 2 {{variable of non-reference type 'int' can be used only with 'val' modifier, but used with 'ref'}}
for (int k = 0; k < argc; ++k) ++k;
#pragma omp simd linear(h) // expected-error {{threadprivate or thread local variable cannot be linear}}
for (int k = 0; k < argc; ++k) ++k;
- #pragma omp simd linear(uval(i))
+ #pragma omp simd linear(uval(i)) // expected-error {{variable of non-reference type 'int' can be used only with 'val' modifier, but used with 'uval'}}
for (int k = 0; k < argc; ++k) ++k;
#pragma omp parallel
{
#pragma omp simd linear(v:i)
for (int k = 0; k < argc; ++k) { i = k; v += i; }
}
- #pragma omp simd linear(j)
+ #pragma omp simd linear(ref(j))
+ for (int k = 0; k < argc; ++k) ++k;
+ #pragma omp simd linear(uval(j))
for (int k = 0; k < argc; ++k) ++k;
int v = 0;
#pragma omp simd linear(v:j)
}
void linear_modifiers(int argc) {
- int f;
+ int &f = argc;
#pragma omp simd linear(f)
for (int k = 0; k < argc; ++k) ++k;
#pragma omp simd linear(val(f))
int i;
#pragma omp simd linear(val(i))
for (int k = 0; k < argc; ++k) ++k;
- #pragma omp simd linear(uval(i) : 4)
+ #pragma omp simd linear(uval(i) : 4) // expected-error {{variable of non-reference type 'int' can be used only with 'val' modifier, but used with 'uval'}}
for (int k = 0; k < argc; ++k) { ++k; i += 4; }
}
#pragma omp simd linear(ref(j))
#pragma omp simd linear(i)
for (int k = 0; k < argc; ++k) ++k;
- foomain<int,char>(argc,argv);
+ foomain<int,char>(argc,argv); // expected-note {{in instantiation of function template specialization 'foomain<int, char>' requested here}}
return 0;
}