Reverted OpenCL2.0 atomic type commits r231932, r231935
(caused undesirable update of -std flag to use _Atomic) llvm-svn: 231942
This commit is contained in:
parent
343832181b
commit
e8d88ac185
|
@ -7119,8 +7119,8 @@ def ext_c99_array_usage : Extension<
|
|||
def err_c99_array_usage_cxx : Error<
|
||||
"%select{qualifier in |static |}0array size %select{||'[*] '}0is a C99 "
|
||||
"feature, not permitted in C++">;
|
||||
def err_type_requires_extension : Error<
|
||||
"use of type %0 requires %1 extension to be enabled">;
|
||||
def err_double_requires_fp64 : Error<
|
||||
"use of type 'double' requires cl_khr_fp64 extension to be enabled">;
|
||||
def err_int128_unsupported : Error<
|
||||
"__int128 is not supported on this target">;
|
||||
def err_nsconsumed_attribute_mismatch : Error<
|
||||
|
@ -7297,8 +7297,6 @@ def err_opencl_return_value_with_address_space : Error<
|
|||
"return value cannot be qualified with address space">;
|
||||
def err_opencl_constant_no_init : Error<
|
||||
"variable in constant address space must be initialized">;
|
||||
def err_atomic_assignment : Error <
|
||||
"assigning directly to an atomic object is not allowed">;
|
||||
} // end of sema category
|
||||
|
||||
let CategoryName = "OpenMP Issue" in {
|
||||
|
|
|
@ -270,7 +270,7 @@ KEYWORD(volatile , KEYALL)
|
|||
KEYWORD(while , KEYALL)
|
||||
KEYWORD(_Alignas , KEYALL)
|
||||
KEYWORD(_Alignof , KEYALL)
|
||||
KEYWORD(_Atomic , KEYC11|KEYCXX11|KEYNOMS)
|
||||
KEYWORD(_Atomic , KEYALL|KEYNOMS)
|
||||
KEYWORD(_Bool , KEYNOCXX)
|
||||
KEYWORD(_Complex , KEYALL)
|
||||
KEYWORD(_Generic , KEYALL)
|
||||
|
|
|
@ -212,29 +212,6 @@ void Sema::Initialize() {
|
|||
addImplicitTypedef("image3d_t", Context.OCLImage3dTy);
|
||||
addImplicitTypedef("sampler_t", Context.OCLSamplerTy);
|
||||
addImplicitTypedef("event_t", Context.OCLEventTy);
|
||||
if (getLangOpts().OpenCLVersion >= 200) {
|
||||
addImplicitTypedef("atomic_int", Context.getAtomicType(Context.IntTy));
|
||||
addImplicitTypedef("atomic_uint",
|
||||
Context.getAtomicType(Context.UnsignedIntTy));
|
||||
addImplicitTypedef("atomic_long", Context.getAtomicType(Context.LongTy));
|
||||
addImplicitTypedef("atomic_ulong",
|
||||
Context.getAtomicType(Context.UnsignedLongTy));
|
||||
addImplicitTypedef("atomic_float",
|
||||
Context.getAtomicType(Context.FloatTy));
|
||||
addImplicitTypedef("atomic_double",
|
||||
Context.getAtomicType(Context.DoubleTy));
|
||||
// OpenCLC v2.0, s6.13.11.6 requires that atomic_flag is implemented as
|
||||
// 32-bit integer and OpenCLC v2.0, s6.1.1 int is always 32-bit wide.
|
||||
addImplicitTypedef("atomic_flag", Context.getAtomicType(Context.IntTy));
|
||||
addImplicitTypedef("atomic_intptr_t",
|
||||
Context.getAtomicType(Context.getIntPtrType()));
|
||||
addImplicitTypedef("atomic_uintptr_t",
|
||||
Context.getAtomicType(Context.getUIntPtrType()));
|
||||
addImplicitTypedef("atomic_size_t",
|
||||
Context.getAtomicType(Context.getSizeType()));
|
||||
addImplicitTypedef("atomic_ptrdiff_t",
|
||||
Context.getAtomicType(Context.getPointerDiffType()));
|
||||
}
|
||||
}
|
||||
|
||||
DeclarationName BuiltinVaList = &Context.Idents.get("__builtin_va_list");
|
||||
|
|
|
@ -9747,19 +9747,6 @@ ExprResult Sema::CreateBuiltinBinOp(SourceLocation OpLoc,
|
|||
return ExprError();
|
||||
}
|
||||
|
||||
if (getLangOpts().OpenCL) {
|
||||
// OpenCLC v2.0 s6.13.11.8 forbids operations on atomic types.
|
||||
if (LHSExpr->getType()->isAtomicType() ||
|
||||
RHSExpr->getType()->isAtomicType()) {
|
||||
SourceRange SR(LHSExpr->getLocStart(), RHSExpr->getLocEnd());
|
||||
if (Opc == BO_Assign)
|
||||
Diag(OpLoc, diag::err_atomic_assignment) << SR;
|
||||
else
|
||||
ResultTy = InvalidOperands(OpLoc, LHS, RHS);
|
||||
return ExprError();
|
||||
}
|
||||
}
|
||||
|
||||
switch (Opc) {
|
||||
case BO_Assign:
|
||||
ResultTy = CheckAssignmentOperands(LHS.get(), RHS, OpLoc, QualType());
|
||||
|
@ -10232,15 +10219,6 @@ ExprResult Sema::CreateBuiltinUnaryOp(SourceLocation OpLoc,
|
|||
ExprValueKind VK = VK_RValue;
|
||||
ExprObjectKind OK = OK_Ordinary;
|
||||
QualType resultType;
|
||||
if (getLangOpts().OpenCL) {
|
||||
// OpenCLC v2.0 s6.13.11.8, the only legal unary operation.
|
||||
// for atomics is '&'.
|
||||
if (Opc != UO_AddrOf && InputExpr->getType()->isAtomicType()) {
|
||||
return ExprError(Diag(OpLoc, diag::err_typecheck_unary_expr)
|
||||
<< InputExpr->getType()
|
||||
<< Input.get()->getSourceRange());
|
||||
}
|
||||
}
|
||||
switch (Opc) {
|
||||
case UO_PreInc:
|
||||
case UO_PreDec:
|
||||
|
|
|
@ -871,8 +871,7 @@ static QualType ConvertDeclSpecToType(TypeProcessingState &state) {
|
|||
if (S.getLangOpts().OpenCL &&
|
||||
!((S.getLangOpts().OpenCLVersion >= 120) ||
|
||||
S.getOpenCLOptions().cl_khr_fp64)) {
|
||||
S.Diag(DS.getTypeSpecTypeLoc(), diag::err_type_requires_extension)
|
||||
<< Result << "cl_khr_fp64";
|
||||
S.Diag(DS.getTypeSpecTypeLoc(), diag::err_double_requires_fp64);
|
||||
declarator.setInvalidType(true);
|
||||
}
|
||||
break;
|
||||
|
@ -948,30 +947,6 @@ static QualType ConvertDeclSpecToType(TypeProcessingState &state) {
|
|||
<< DS.getSourceRange();
|
||||
declarator.setInvalidType(true);
|
||||
}
|
||||
} else if (S.getLangOpts().OpenCL) {
|
||||
if (const AtomicType *AT = Result->getAs<AtomicType>()) {
|
||||
const BuiltinType *BT = AT->getValueType()->getAs<BuiltinType>();
|
||||
bool NoExtTypes = BT && (BT->getKind() == BuiltinType::Int ||
|
||||
BT->getKind() == BuiltinType::UInt ||
|
||||
BT->getKind() == BuiltinType::Float);
|
||||
if (!S.getOpenCLOptions().cl_khr_int64_base_atomics && !NoExtTypes) {
|
||||
S.Diag(DS.getTypeSpecTypeLoc(), diag::err_type_requires_extension)
|
||||
<< Result << "cl_khr_int64_base_atomics";
|
||||
declarator.setInvalidType(true);
|
||||
}
|
||||
if (!S.getOpenCLOptions().cl_khr_int64_extended_atomics &&
|
||||
!NoExtTypes) {
|
||||
S.Diag(DS.getTypeSpecTypeLoc(), diag::err_type_requires_extension)
|
||||
<< Result << "cl_khr_int64_extended_atomics";
|
||||
declarator.setInvalidType(true);
|
||||
}
|
||||
if (!S.getOpenCLOptions().cl_khr_fp64 && BT &&
|
||||
BT->getKind() == BuiltinType::Double) {
|
||||
S.Diag(DS.getTypeSpecTypeLoc(), diag::err_type_requires_extension)
|
||||
<< Result << "cl_khr_fp64";
|
||||
declarator.setInvalidType(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// TypeQuals handled by caller.
|
||||
|
|
|
@ -1,69 +0,0 @@
|
|||
// RUN: %clang_cc1 %s -verify -pedantic -fsyntax-only
|
||||
// RUN: %clang_cc1 %s -verify -fsyntax-only -cl-std=CL2.0 -DCL20
|
||||
// RUN: %clang_cc1 %s -verify -fsyntax-only -cl-std=CL2.0 -DCL20 -DEXT
|
||||
|
||||
#ifdef EXT
|
||||
#pragma OPENCL EXTENSION cl_khr_int64_base_atomics:enable
|
||||
#pragma OPENCL EXTENSION cl_khr_int64_extended_atomics:enable
|
||||
#pragma OPENCL EXTENSION cl_khr_fp64:enable
|
||||
#endif
|
||||
|
||||
void atomic_types_test() {
|
||||
// OpenCL v2.0 s6.13.11.6 defines supported atomic types.
|
||||
atomic_int i;
|
||||
atomic_uint ui;
|
||||
atomic_long l;
|
||||
atomic_ulong ul;
|
||||
atomic_float f;
|
||||
atomic_double d;
|
||||
atomic_flag fl;
|
||||
atomic_intptr_t ip;
|
||||
atomic_uintptr_t uip;
|
||||
atomic_size_t s;
|
||||
atomic_ptrdiff_t pd;
|
||||
// OpenCL v2.0 s6.13.11.8, _Atomic type specifier and _Atomic type qualifier
|
||||
// are not supported by OpenCL.
|
||||
_Atomic int i; // expected-error {{use of undeclared identifier '_Atomic'}}
|
||||
}
|
||||
#ifndef CL20
|
||||
// expected-error@-16 {{use of undeclared identifier 'atomic_int'}}
|
||||
// expected-error@-16 {{use of undeclared identifier 'atomic_uint'}}
|
||||
// expected-error@-16 {{use of undeclared identifier 'atomic_long'}}
|
||||
// expected-error@-16 {{use of undeclared identifier 'atomic_ulong'}}
|
||||
// expected-error@-16 {{use of undeclared identifier 'atomic_float'}}
|
||||
// expected-error@-16 {{use of undeclared identifier 'atomic_double'}}
|
||||
// expected-error@-16 {{use of undeclared identifier 'atomic_flag'}}
|
||||
// expected-error@-16 {{use of undeclared identifier 'atomic_intptr_t'}}
|
||||
// expected-error@-16 {{use of undeclared identifier 'atomic_uintptr_t'}}
|
||||
// expected-error@-16 {{use of undeclared identifier 'atomic_size_t'}}
|
||||
// expected-error@-16 {{use of undeclared identifier 'atomic_ptrdiff_t'}}
|
||||
#elif !EXT
|
||||
// expected-error@-26 {{use of type 'atomic_long' (aka '_Atomic(long)') requires cl_khr_int64_base_atomics extension to be enabled}}
|
||||
// expected-error@-27 {{use of type 'atomic_long' (aka '_Atomic(long)') requires cl_khr_int64_extended_atomics extension to be enabled}}
|
||||
// expected-error@-27 {{use of type 'atomic_ulong' (aka '_Atomic(unsigned long)') requires cl_khr_int64_base_atomics extension to be enabled}}
|
||||
// expected-error@-28 {{use of type 'atomic_ulong' (aka '_Atomic(unsigned long)') requires cl_khr_int64_extended_atomics extension to be enabled}}
|
||||
// expected-error@-27 {{use of type 'atomic_double' (aka '_Atomic(double)') requires cl_khr_int64_base_atomics extension to be enabled}}
|
||||
// expected-error@-28 {{use of type 'atomic_double' (aka '_Atomic(double)') requires cl_khr_int64_extended_atomics extension to be enabled}}
|
||||
// expected-error@-29 {{use of type 'atomic_double' (aka '_Atomic(double)') requires cl_khr_fp64 extension to be enabled}}
|
||||
// expected-error-re@-28 {{use of type 'atomic_intptr_t' (aka '_Atomic({{.+}})') requires cl_khr_int64_base_atomics extension to be enabled}}
|
||||
// expected-error-re@-29 {{use of type 'atomic_intptr_t' (aka '_Atomic({{.+}})') requires cl_khr_int64_extended_atomics extension to be enabled}}
|
||||
// expected-error-re@-29 {{use of type 'atomic_uintptr_t' (aka '_Atomic({{.+}})') requires cl_khr_int64_base_atomics extension to be enabled}}
|
||||
// expected-error-re@-30 {{use of type 'atomic_uintptr_t' (aka '_Atomic({{.+}})') requires cl_khr_int64_extended_atomics extension to be enabled}}
|
||||
// expected-error-re@-30 {{use of type 'atomic_size_t' (aka '_Atomic({{.+}})') requires cl_khr_int64_base_atomics extension to be enabled}}
|
||||
// expected-error-re@-31 {{use of type 'atomic_size_t' (aka '_Atomic({{.+}})') requires cl_khr_int64_extended_atomics extension to be enabled}}
|
||||
// expected-error-re@-31 {{use of type 'atomic_ptrdiff_t' (aka '_Atomic({{.+}})') requires cl_khr_int64_base_atomics extension to be enabled}}
|
||||
// expected-error-re@-32 {{use of type 'atomic_ptrdiff_t' (aka '_Atomic({{.+}})') requires cl_khr_int64_extended_atomics extension to be enabled}}
|
||||
#endif
|
||||
|
||||
#ifdef CL20
|
||||
void foo(atomic_int * ptr) {}
|
||||
void atomic_ops_test() {
|
||||
atomic_int i;
|
||||
foo(&i);
|
||||
// OpenCL v2.0 s6.13.11.8, arithemtic operation are not permitted on atomic types.
|
||||
i++; // expected-error {{invalid argument type 'atomic_int' (aka '_Atomic(int)') to unary expression}}
|
||||
i = 1; // expected-error {{assigning directly to an atomic object is not allowed}}
|
||||
i += 1; // expected-error {{invalid operands to binary expression ('atomic_int' (aka '_Atomic(int)') and 'int')}}
|
||||
i = i + i; // expected-error {{invalid operands to binary expression ('atomic_int' (aka '_Atomic(int)') and 'atomic_int')}}
|
||||
}
|
||||
#endif
|
|
@ -1,3 +1,4 @@
|
|||
// RUN: %clang_cc1 -verify -pedantic %s -std=c++98
|
||||
// RUN: %clang_cc1 -verify -pedantic %s -std=c++11
|
||||
|
||||
template<typename T> struct atomic {
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s
|
||||
// RUN: %clang_cc1 -fsyntax-only -verify %s
|
||||
int g(int);
|
||||
|
||||
void f() {
|
||||
|
|
Loading…
Reference in New Issue