mirror of https://github.com/microsoft/clang.git
[OpenCL] Use the semantic spelling of the Access attribute, rather than a string.
Also fix a latent bug, due to an incorrect traversal of the AttributeList. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@287100 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
86ec285235
commit
94d71a2d8b
|
@ -1209,19 +1209,19 @@ TypeResult Sema::actOnObjCTypeArgsAndProtocolQualifiers(
|
|||
return CreateParsedType(Result, ResultTInfo);
|
||||
}
|
||||
|
||||
static StringRef getImageAccessAttrStr(AttributeList *attrs) {
|
||||
if (attrs) {
|
||||
|
||||
AttributeList *Next;
|
||||
static OpenCLAccessAttr::Spelling getImageAccess(const AttributeList *Attrs) {
|
||||
if (Attrs) {
|
||||
const AttributeList *Next = Attrs;
|
||||
do {
|
||||
AttributeList &Attr = *attrs;
|
||||
const AttributeList &Attr = *Next;
|
||||
Next = Attr.getNext();
|
||||
if (Attr.getKind() == AttributeList::AT_OpenCLAccess) {
|
||||
return Attr.getName()->getName();
|
||||
return static_cast<OpenCLAccessAttr::Spelling>(
|
||||
Attr.getSemanticSpelling());
|
||||
}
|
||||
} while (Next);
|
||||
}
|
||||
return "";
|
||||
return OpenCLAccessAttr::Keyword_read_only;
|
||||
}
|
||||
|
||||
/// \brief Convert the specified declspec to the appropriate type
|
||||
|
@ -1619,11 +1619,14 @@ static QualType ConvertDeclSpecToType(TypeProcessingState &state) {
|
|||
|
||||
#define GENERIC_IMAGE_TYPE(ImgType, Id) \
|
||||
case DeclSpec::TST_##ImgType##_t: \
|
||||
Result = llvm::StringSwitch<QualType>( \
|
||||
getImageAccessAttrStr(DS.getAttributes().getList())) \
|
||||
.Cases("write_only", "__write_only", Context.Id##WOTy) \
|
||||
.Cases("read_write", "__read_write", Context.Id##RWTy) \
|
||||
.Default(Context.Id##ROTy); \
|
||||
switch (getImageAccess(DS.getAttributes().getList())) { \
|
||||
case OpenCLAccessAttr::Keyword_write_only: \
|
||||
Result = Context.Id##WOTy; break; \
|
||||
case OpenCLAccessAttr::Keyword_read_write: \
|
||||
Result = Context.Id##RWTy; break; \
|
||||
case OpenCLAccessAttr::Keyword_read_only: \
|
||||
Result = Context.Id##ROTy; break; \
|
||||
} \
|
||||
break;
|
||||
#include "clang/Basic/OpenCLImageTypes.def"
|
||||
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
// RUN: %clang_cc1 -verify %s
|
||||
// RUN: %clang_cc1 -verify -D=ATTR_TEST -fms-compatibility %s
|
||||
|
||||
void test1(image1d_t *i) {} // expected-error{{pointer to type '__read_only image1d_t' is invalid in OpenCL}}
|
||||
|
||||
|
@ -12,3 +13,8 @@ void test2(image1d_t i) {
|
|||
}
|
||||
|
||||
image1d_t test3() {} // expected-error{{declaring function return value of type '__read_only image1d_t' is not allowed}}
|
||||
|
||||
#ifdef ATTR_TEST
|
||||
// Test case for an infinite loop bug.
|
||||
kernel void foob(read_only __ptr32 image2d_t i) { } // expected-error{{'__ptr32' attribute only applies to pointer arguments}}
|
||||
#endif
|
||||
|
|
Loading…
Reference in New Issue