Author: erichkeane
Date: 2025-04-09T14:55:50-07:00
New Revision: d47401e376d458fb9bb4f4f9be0e07c0fdd7a52c

URL: 
https://github.com/llvm/llvm-project/commit/d47401e376d458fb9bb4f4f9be0e07c0fdd7a52c
DIFF: 
https://github.com/llvm/llvm-project/commit/d47401e376d458fb9bb4f4f9be0e07c0fdd7a52c.diff

LOG: [OpenACC] Start enforcing 'device_type' clause values

Researching in prep of doing the implementation for lowering, I found
that the source of the valid identifiers list from flang is in the
frontend.  This patch adds the same list to the frontend, but does it as
a sema diagnostic, so we still parse it as an identifier/identifier-like
thing, but then diagnose it as invalid later.

Added: 
    clang/test/SemaOpenACC/device_type_valid_values.c

Modified: 
    clang/include/clang/Basic/DiagnosticSemaKinds.td
    clang/lib/Sema/SemaOpenACCClause.cpp
    clang/test/AST/ast-print-openacc-combined-construct.cpp
    clang/test/AST/ast-print-openacc-compute-construct.cpp
    clang/test/AST/ast-print-openacc-data-construct.cpp
    clang/test/AST/ast-print-openacc-init-construct.cpp
    clang/test/AST/ast-print-openacc-loop-construct.cpp
    clang/test/AST/ast-print-openacc-routine-construct.cpp
    clang/test/AST/ast-print-openacc-set-construct.cpp
    clang/test/AST/ast-print-openacc-shutdown-construct.cpp
    clang/test/AST/ast-print-openacc-update-construct.cpp
    clang/test/ParserOpenACC/parse-clauses.c
    clang/test/SemaOpenACC/combined-construct-device_type-ast.cpp
    clang/test/SemaOpenACC/combined-construct-device_type-clause.c
    clang/test/SemaOpenACC/combined-construct-device_type-clause.cpp
    clang/test/SemaOpenACC/compute-construct-device_type-ast.cpp
    clang/test/SemaOpenACC/compute-construct-device_type-clause.c
    clang/test/SemaOpenACC/compute-construct-device_type-clause.cpp
    clang/test/SemaOpenACC/data-construct-device_type-ast.cpp
    clang/test/SemaOpenACC/data-construct-device_type-clause.c
    clang/test/SemaOpenACC/init-construct-ast.cpp
    clang/test/SemaOpenACC/init-construct.cpp
    clang/test/SemaOpenACC/loop-construct-device_type-ast.cpp
    clang/test/SemaOpenACC/loop-construct-device_type-clause.c
    clang/test/SemaOpenACC/loop-construct-device_type-clause.cpp
    clang/test/SemaOpenACC/routine-construct-ast.cpp
    clang/test/SemaOpenACC/routine-construct-clauses.cpp
    clang/test/SemaOpenACC/set-construct-ast.cpp
    clang/test/SemaOpenACC/set-construct.cpp
    clang/test/SemaOpenACC/shutdown-construct-ast.cpp
    clang/test/SemaOpenACC/shutdown-construct.cpp
    clang/test/SemaOpenACC/update-construct-ast.cpp
    clang/test/SemaOpenACC/update-construct.cpp

Removed: 
    


################################################################################
diff  --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td 
b/clang/include/clang/Basic/DiagnosticSemaKinds.td
index d17519d4c4155..fdf3f8816e746 100644
--- a/clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -13061,6 +13061,8 @@ def err_acc_decl_for_routine
     : Error<"expected function or lambda declaration for 'routine' construct">;
 def err_acc_invalid_modifier
     : Error<"OpenACC '%0' modifier not valid on '%1' clause">;
+def err_acc_invalid_default_type
+    : Error<"invalid value %0 in '%1' clause; valid values are %2">;
 
 // AMDGCN builtins diagnostics
 def err_amdgcn_load_lds_size_invalid_value : Error<"invalid size value">;

diff  --git a/clang/lib/Sema/SemaOpenACCClause.cpp 
b/clang/lib/Sema/SemaOpenACCClause.cpp
index 7d10c50d404d2..8aa0c52f0ce19 100644
--- a/clang/lib/Sema/SemaOpenACCClause.cpp
+++ b/clang/lib/Sema/SemaOpenACCClause.cpp
@@ -1338,13 +1338,50 @@ OpenACCClause 
*SemaOpenACCClauseVisitor::VisitDeviceTypeClause(
       checkAlreadyHasClauseOfKind(SemaRef, ExistingClauses, Clause))
     return nullptr;
 
-  // TODO OpenACC: Once we get enough of the CodeGen implemented that we have
-  // a source for the list of valid architectures, we need to warn on unknown
-  // identifiers here.
+  // The list of valid device_type values. Flang also has these hardcoded in
+  // openacc_parsers.cpp, as there does not seem to be a reliable backend
+  // source. The list below is sourced from Flang, though NVC++ supports only
+  // 'nvidia', 'host', 'multicore', and 'default'.
+  const std::array<llvm::StringLiteral, 6> ValidValues{
+      "default", "nvidia", "acc_device_nvidia", "radeon", "host", "multicore"};
+  // As an optimization, we have a manually maintained list of valid values
+  // below, rather than trying to calculate from above. These should be kept in
+  // sync if/when the above list ever changes.
+  std::string ValidValuesString =
+      "'default', 'nvidia', 'acc_device_nvidia', 'radeon', 'host', 
'multicore'";
+
+  llvm::SmallVector<DeviceTypeArgument> Architectures{
+      Clause.getDeviceTypeArchitectures()};
+
+  // The parser has ensured that we either have a single entry of just '*'
+  // (represented by a nullptr IdentifierInfo), or a list.
+
+  bool Diagnosed = false;
+  auto FilterPred = [&](const DeviceTypeArgument &Arch) {
+    // The '*' case.
+    if (!Arch.first)
+      return false;
+    return llvm::find_if(ValidValues, [&](StringRef RHS) {
+             return Arch.first->getName().equals_insensitive(RHS);
+           }) == ValidValues.end();
+  };
+
+  auto Diagnose = [&](const DeviceTypeArgument &Arch) {
+    Diagnosed = SemaRef.Diag(Arch.second, diag::err_acc_invalid_default_type)
+                << Arch.first << Clause.getClauseKind() << ValidValuesString;
+  };
+
+  // There aren't stable enumertor versions of 'for-each-then-erase', so do it
+  // here.  We DO keep track of whether we diagnosed something to make sure we
+  // don't do the 'erase_if' in the event that the first list didn't find
+  // anything.
+  llvm::for_each(llvm::make_filter_range(Architectures, FilterPred), Diagnose);
+  if (Diagnosed)
+    llvm::erase_if(Architectures, FilterPred);
 
   return OpenACCDeviceTypeClause::Create(
       Ctx, Clause.getClauseKind(), Clause.getBeginLoc(), Clause.getLParenLoc(),
-      Clause.getDeviceTypeArchitectures(), Clause.getEndLoc());
+      Architectures, Clause.getEndLoc());
 }
 
 OpenACCClause *SemaOpenACCClauseVisitor::VisitAutoClause(

diff  --git a/clang/test/AST/ast-print-openacc-combined-construct.cpp 
b/clang/test/AST/ast-print-openacc-combined-construct.cpp
index be959fb2b6117..7331ec3786e99 100644
--- a/clang/test/AST/ast-print-openacc-combined-construct.cpp
+++ b/clang/test/AST/ast-print-openacc-combined-construct.cpp
@@ -37,40 +37,40 @@ void foo() {
   bool SomeB;
   struct SomeStruct{} SomeStructImpl;
 
-//CHECK: #pragma acc parallel loop dtype(SomeB)
+//CHECK: #pragma acc parallel loop dtype(default)
 // CHECK-NEXT: for (int i = 0; i < 5; ++i)
 // CHECK-NEXT: ;
-#pragma acc parallel loop dtype(SomeB)
+#pragma acc parallel loop dtype(default)
   for(int i = 0;i<5;++i);
 
-//CHECK: #pragma acc serial loop device_type(SomeStruct)
+//CHECK: #pragma acc serial loop device_type(radeon, host)
 // CHECK-NEXT: for (int i = 0; i < 5; ++i)
 // CHECK-NEXT: ;
-#pragma acc serial loop device_type(SomeStruct)
+#pragma acc serial loop device_type(radeon, host)
   for(int i = 0;i<5;++i);
 
-//CHECK: #pragma acc kernels loop device_type(int)
+//CHECK: #pragma acc kernels loop device_type(nvidia)
 // CHECK-NEXT: for (int i = 0; i < 5; ++i)
 // CHECK-NEXT: ;
-#pragma acc kernels loop device_type(int)
+#pragma acc kernels loop device_type(nvidia)
   for(int i = 0;i<5;++i);
 
-//CHECK: #pragma acc parallel loop dtype(bool)
+//CHECK: #pragma acc parallel loop dtype(multicore)
 // CHECK-NEXT: for (int i = 0; i < 5; ++i)
 // CHECK-NEXT: ;
-#pragma acc parallel loop dtype(bool)
+#pragma acc parallel loop dtype(multicore)
   for(int i = 0;i<5;++i);
 
-//CHECK: #pragma acc serial loop device_type(SomeStructImpl)
+//CHECK: #pragma acc serial loop device_type(default)
 // CHECK-NEXT: for (int i = 0; i < 5; ++i)
 // CHECK-NEXT: ;
-#pragma acc serial loop device_type (SomeStructImpl)
+#pragma acc serial loop device_type (default)
   for(int i = 0;i<5;++i);
 
-// CHECK: #pragma acc kernels loop dtype(AnotherIdent)
+// CHECK: #pragma acc kernels loop dtype(host)
 // CHECK-NEXT: for (int i = 0; i < 5; ++i)
 // CHECK-NEXT: ;
-#pragma acc kernels loop dtype(AnotherIdent)
+#pragma acc kernels loop dtype(host)
   for(int i = 0;i<5;++i);
 
   int i;

diff  --git a/clang/test/AST/ast-print-openacc-compute-construct.cpp 
b/clang/test/AST/ast-print-openacc-compute-construct.cpp
index 1fbb81a220aab..7c3ac17ec1a2c 100644
--- a/clang/test/AST/ast-print-openacc-compute-construct.cpp
+++ b/clang/test/AST/ast-print-openacc-compute-construct.cpp
@@ -115,24 +115,24 @@ void foo() {
   bool SomeB;
   struct SomeStruct{} SomeStructImpl;
 
-//CHECK: #pragma acc parallel dtype(SomeB)
-#pragma acc parallel dtype(SomeB)
+//CHECK: #pragma acc parallel dtype(default)
+#pragma acc parallel dtype(default)
   while(true);
 
-//CHECK: #pragma acc parallel device_type(SomeStruct)
-#pragma acc parallel device_type(SomeStruct)
+//CHECK: #pragma acc parallel device_type(radeon)
+#pragma acc parallel device_type(radeon)
   while(true);
 
-//CHECK: #pragma acc parallel device_type(int)
-#pragma acc parallel device_type(int)
+//CHECK: #pragma acc parallel device_type(nvidia)
+#pragma acc parallel device_type(nvidia)
   while(true);
 
-//CHECK: #pragma acc parallel dtype(bool)
-#pragma acc parallel dtype(bool)
+//CHECK: #pragma acc parallel dtype(multicore)
+#pragma acc parallel dtype(multicore)
   while(true);
 
-//CHECK: #pragma acc parallel device_type(SomeStructImpl)
-#pragma acc parallel device_type (SomeStructImpl)
+//CHECK: #pragma acc parallel device_type(host)
+#pragma acc parallel device_type (host)
   while(true);
 
 //CHECK: #pragma acc parallel reduction(+: iPtr)

diff  --git a/clang/test/AST/ast-print-openacc-data-construct.cpp 
b/clang/test/AST/ast-print-openacc-data-construct.cpp
index b7d2428fb605a..98c785032b778 100644
--- a/clang/test/AST/ast-print-openacc-data-construct.cpp
+++ b/clang/test/AST/ast-print-openacc-data-construct.cpp
@@ -2,16 +2,12 @@
 
 void foo() {
   int Var;
-  // TODO OpenACC: These are only legal if they have one of a list of clauses 
on
-  // them, so the 'check' lines should start to include those once we implement
-  // them.  For now, they don't emit those because they are 'not implemented'.
-
 // CHECK: #pragma acc data default(none)
 #pragma acc data default(none)
   ;
 
-// CHECK: #pragma acc data default(none) device_type(int)
-#pragma acc data default(none) device_type(int)
+// CHECK: #pragma acc data default(none) device_type(radeon)
+#pragma acc data default(none) device_type(radeon)
   ;
 
 // CHECK: #pragma acc enter data copyin(Var)

diff  --git a/clang/test/AST/ast-print-openacc-init-construct.cpp 
b/clang/test/AST/ast-print-openacc-init-construct.cpp
index 0cfcbc99ab145..e77d544944191 100644
--- a/clang/test/AST/ast-print-openacc-init-construct.cpp
+++ b/clang/test/AST/ast-print-openacc-init-construct.cpp
@@ -9,6 +9,6 @@ void uses() {
 #pragma acc init device_type(*) device_num(Int)
 // CHECK: #pragma acc init device_type(*) if(Int == 5)
 #pragma acc init device_type(*) if (Int == 5)
-// CHECK: #pragma acc init device_type(SomeName)
-#pragma acc init device_type(SomeName)
+// CHECK: #pragma acc init device_type(radeon)
+#pragma acc init device_type(radeon)
 }

diff  --git a/clang/test/AST/ast-print-openacc-loop-construct.cpp 
b/clang/test/AST/ast-print-openacc-loop-construct.cpp
index 9ddd5c81ca53e..6971089e5919d 100644
--- a/clang/test/AST/ast-print-openacc-loop-construct.cpp
+++ b/clang/test/AST/ast-print-openacc-loop-construct.cpp
@@ -10,28 +10,28 @@ void foo() {
 #pragma acc loop
   for(int i = 0;i<5;++i);
 
-// CHECK: #pragma acc loop device_type(SomeStruct)
+// CHECK: #pragma acc loop device_type(default)
 // CHECK-NEXT: for (int i = 0; i < 5; ++i)
 // CHECK-NEXT: ;
-#pragma acc loop device_type(SomeStruct)
+#pragma acc loop device_type(default)
   for(int i = 0;i<5;++i);
 
-// CHECK: #pragma acc loop device_type(int)
+// CHECK: #pragma acc loop device_type(nvidia)
 // CHECK-NEXT: for (int i = 0; i < 5; ++i)
 // CHECK-NEXT: ;
-#pragma acc loop device_type(int)
+#pragma acc loop device_type(nvidia)
   for(int i = 0;i<5;++i);
 
-// CHECK: #pragma acc loop dtype(bool)
+// CHECK: #pragma acc loop dtype(radeon)
 // CHECK-NEXT: for (int i = 0; i < 5; ++i)
 // CHECK-NEXT: ;
-#pragma acc loop dtype(bool)
+#pragma acc loop dtype(radeon)
   for(int i = 0;i<5;++i);
 
-// CHECK: #pragma acc loop dtype(AnotherIdent)
+// CHECK: #pragma acc loop dtype(host)
 // CHECK-NEXT: for (int i = 0; i < 5; ++i)
 // CHECK-NEXT: ;
-#pragma acc loop dtype(AnotherIdent)
+#pragma acc loop dtype(host)
   for(int i = 0;i<5;++i);
 
 // CHECK: #pragma acc loop independent

diff  --git a/clang/test/AST/ast-print-openacc-routine-construct.cpp 
b/clang/test/AST/ast-print-openacc-routine-construct.cpp
index b3de3402a952c..be8d95387d2ca 100644
--- a/clang/test/AST/ast-print-openacc-routine-construct.cpp
+++ b/clang/test/AST/ast-print-openacc-routine-construct.cpp
@@ -8,10 +8,10 @@ auto Lambda = [](){};
 int function();
 #pragma acc routine (function) vector nohost bind("string")
 // CHECK: #pragma acc routine(function) vector nohost bind("string")
-#pragma acc routine(function) device_type(Something) seq
-// CHECK-NEXT: #pragma acc routine(function) device_type(Something) seq
-#pragma acc routine(function) dtype(Something) seq
-// CHECK-NEXT: #pragma acc routine(function) dtype(Something) seq
+#pragma acc routine(function) device_type(multicore) seq
+// CHECK-NEXT: #pragma acc routine(function) device_type(multicore) seq
+#pragma acc routine(function) dtype(radeon) seq
+// CHECK-NEXT: #pragma acc routine(function) dtype(radeon) seq
 
 #pragma acc routine nohost vector
 int function2();
@@ -136,8 +136,8 @@ struct DepS {
 
 #pragma acc routine (MemFunc) worker dtype(*)
 // CHECK-NEXT: #pragma acc routine(MemFunc) worker dtype(*)
-#pragma acc routine (MemFunc) device_type(Lambda) vector
-// CHECK-NEXT: #pragma acc routine(MemFunc) device_type(Lambda) vector
+#pragma acc routine (MemFunc) device_type(nvidia) vector
+// CHECK-NEXT: #pragma acc routine(MemFunc) device_type(nvidia) vector
 };
 
 // CHECK: #pragma acc routine(DepS<int>::Lambda) gang bind("string")

diff  --git a/clang/test/AST/ast-print-openacc-set-construct.cpp 
b/clang/test/AST/ast-print-openacc-set-construct.cpp
index a801ae16739e4..869a3feb2dd93 100644
--- a/clang/test/AST/ast-print-openacc-set-construct.cpp
+++ b/clang/test/AST/ast-print-openacc-set-construct.cpp
@@ -3,22 +3,22 @@
 unsigned Int;
 
 void uses() {
-// CHECK: #pragma acc set default_async(Int) if(Int == 5) device_type(I) 
device_num(Int)
-#pragma acc set default_async(Int) if (Int == 5) device_type(I) device_num(Int)
-// CHECK: #pragma acc set default_async(Int) device_type(I) device_num(Int)
-#pragma acc set default_async(Int) device_type(I) device_num(Int)
+// CHECK: #pragma acc set default_async(Int) if(Int == 5) device_type(default) 
device_num(Int)
+#pragma acc set default_async(Int) if (Int == 5) device_type(default) 
device_num(Int)
+// CHECK: #pragma acc set default_async(Int) device_type(nvidia) 
device_num(Int)
+#pragma acc set default_async(Int) device_type(nvidia) device_num(Int)
 // CHECK: #pragma acc set default_async(Int) if(Int == 5) device_num(Int)
 #pragma acc set default_async(Int) if (Int == 5) device_num(Int)
-// CHECK: #pragma acc set default_async(Int) if(Int == 5) device_type(I)
-#pragma acc set default_async(Int) if (Int == 5) device_type(I)
-// CHECK: #pragma acc set if(Int == 5) device_type(I) device_num(Int)
-#pragma acc set if (Int == 5) device_type(I) device_num(Int)
+// CHECK: #pragma acc set default_async(Int) if(Int == 5) device_type(host)
+#pragma acc set default_async(Int) if (Int == 5) device_type(host)
+// CHECK: #pragma acc set if(Int == 5) device_type(multicore) device_num(Int)
+#pragma acc set if (Int == 5) device_type(multicore) device_num(Int)
 // CHECK: #pragma acc set default_async(Int)
 #pragma acc set default_async(Int)
 // CHECK: #pragma acc set if(Int == 5)
 #pragma acc set if (Int == 5)
-// CHECK: #pragma acc set device_type(I)
-#pragma acc set device_type(I)
+// CHECK: #pragma acc set device_type(radeon)
+#pragma acc set device_type(radeon)
 // CHECK: #pragma acc set device_num(Int)
 #pragma acc set device_num(Int)
 }

diff  --git a/clang/test/AST/ast-print-openacc-shutdown-construct.cpp 
b/clang/test/AST/ast-print-openacc-shutdown-construct.cpp
index 4e2529658d418..6f6142254a444 100644
--- a/clang/test/AST/ast-print-openacc-shutdown-construct.cpp
+++ b/clang/test/AST/ast-print-openacc-shutdown-construct.cpp
@@ -9,6 +9,6 @@ void uses() {
 #pragma acc shutdown device_type(*) device_num(Int)
 // CHECK: #pragma acc shutdown device_type(*) if(Int == 5)
 #pragma acc shutdown device_type(*) if (Int == 5)
-// CHECK: #pragma acc shutdown device_type(SomeName)
-#pragma acc shutdown device_type(SomeName)
+// CHECK: #pragma acc shutdown device_type(radeon)
+#pragma acc shutdown device_type(radeon)
 }

diff  --git a/clang/test/AST/ast-print-openacc-update-construct.cpp 
b/clang/test/AST/ast-print-openacc-update-construct.cpp
index f999e1037e904..289754f181d96 100644
--- a/clang/test/AST/ast-print-openacc-update-construct.cpp
+++ b/clang/test/AST/ast-print-openacc-update-construct.cpp
@@ -30,11 +30,11 @@ void uses(bool cond) {
 // CHECK: #pragma acc update self(I) wait(devnum: I : queues: *iPtr, I) if(I 
== array[I]) async(I)
 #pragma acc update self(I) wait(devnum:I:queues:*iPtr, I) if(I == array[I]) 
async(I)
 
-// CHECK: #pragma acc update self(I) device_type(I) dtype(H)
-#pragma acc update self(I) device_type(I) dtype(H)
+// CHECK: #pragma acc update self(I) device_type(nvidia) dtype(host)
+#pragma acc update self(I) device_type(nvidia) dtype(host)
 
-// CHECK: #pragma acc update self(I) device_type(J) dtype(K)
-#pragma acc update self(I) device_type(J) dtype(K)
+// CHECK: #pragma acc update self(I) device_type(radeon) dtype(multicore)
+#pragma acc update self(I) device_type(radeon) dtype(multicore)
 
 // CHECK: #pragma acc update self(I, iPtr, array, array[1], array[1:2])
 #pragma acc update self(I, iPtr, array, array[1], array[1:2])

diff  --git a/clang/test/ParserOpenACC/parse-clauses.c 
b/clang/test/ParserOpenACC/parse-clauses.c
index 2319b1abb9e83..ef0bccf390297 100644
--- a/clang/test/ParserOpenACC/parse-clauses.c
+++ b/clang/test/ParserOpenACC/parse-clauses.c
@@ -1080,11 +1080,27 @@ void device_type() {
 #pragma acc parallel dtype(31, "bar")
   {}
 
+  // expected-error@+4{{invalid value 'ident' in 'device_type' clause; valid 
values are 'default', 'nvidia', 'acc_device_nvidia', 'radeon', 'host', 
'multicore'}}
+  // expected-error@+3{{invalid value 'auto' in 'device_type' clause; valid 
values are 'default', 'nvidia', 'acc_device_nvidia', 'radeon', 'host', 
'multicore'}}
+  // expected-error@+2{{invalid value 'int' in 'device_type' clause; valid 
values are 'default', 'nvidia', 'acc_device_nvidia', 'radeon', 'host', 
'multicore'}}
+  // expected-error@+1{{invalid value 'float' in 'device_type' clause; valid 
values are 'default', 'nvidia', 'acc_device_nvidia', 'radeon', 'host', 
'multicore'}}
 #pragma acc parallel device_type(ident, auto, int, float)
   {}
+  // expected-error@+4{{invalid value 'ident' in 'dtype' clause; valid values 
are 'default', 'nvidia', 'acc_device_nvidia', 'radeon', 'host', 'multicore'}}
+  // expected-error@+3{{invalid value 'auto' in 'dtype' clause; valid values 
are 'default', 'nvidia', 'acc_device_nvidia', 'radeon', 'host', 'multicore'}}
+  // expected-error@+2{{invalid value 'int' in 'dtype' clause; valid values 
are 'default', 'nvidia', 'acc_device_nvidia', 'radeon', 'host', 'multicore'}}
+  // expected-error@+1{{invalid value 'float' in 'dtype' clause; valid values 
are 'default', 'nvidia', 'acc_device_nvidia', 'radeon', 'host', 'multicore'}}
 #pragma acc parallel dtype(ident, auto, int, float)
   {}
 
+  // expected-error@+8{{invalid value 'ident' in 'device_type' clause; valid 
values are 'default', 'nvidia', 'acc_device_nvidia', 'radeon', 'host', 
'multicore'}}
+  // expected-error@+7{{invalid value 'auto' in 'device_type' clause; valid 
values are 'default', 'nvidia', 'acc_device_nvidia', 'radeon', 'host', 
'multicore'}}
+  // expected-error@+6{{invalid value 'int' in 'device_type' clause; valid 
values are 'default', 'nvidia', 'acc_device_nvidia', 'radeon', 'host', 
'multicore'}}
+  // expected-error@+5{{invalid value 'float' in 'device_type' clause; valid 
values are 'default', 'nvidia', 'acc_device_nvidia', 'radeon', 'host', 
'multicore'}}
+  // expected-error@+4{{invalid value 'ident' in 'dtype' clause; valid values 
are 'default', 'nvidia', 'acc_device_nvidia', 'radeon', 'host', 'multicore'}}
+  // expected-error@+3{{invalid value 'auto' in 'dtype' clause; valid values 
are 'default', 'nvidia', 'acc_device_nvidia', 'radeon', 'host', 'multicore'}}
+  // expected-error@+2{{invalid value 'int' in 'dtype' clause; valid values 
are 'default', 'nvidia', 'acc_device_nvidia', 'radeon', 'host', 'multicore'}}
+  // expected-error@+1{{invalid value 'float' in 'dtype' clause; valid values 
are 'default', 'nvidia', 'acc_device_nvidia', 'radeon', 'host', 'multicore'}}
 #pragma acc parallel device_type(ident, auto, int, float) dtype(ident, auto, 
int, float)
   {}
 }

diff  --git a/clang/test/SemaOpenACC/combined-construct-device_type-ast.cpp 
b/clang/test/SemaOpenACC/combined-construct-device_type-ast.cpp
index abc65dfc9e522..5994f09f2e693 100644
--- a/clang/test/SemaOpenACC/combined-construct-device_type-ast.cpp
+++ b/clang/test/SemaOpenACC/combined-construct-device_type-ast.cpp
@@ -19,11 +19,11 @@ void NormalUses() {
   // CHECK-NEXT: DeclStmt
   // CHECK-NEXT: VarDecl{{.*}} SomeVar 'bool'
 
-#pragma acc parallel loop device_type(SomeS) dtype(SomeImpl)
+#pragma acc parallel loop device_type(*) dtype(default)
   for(int i = 0; i < 5; ++i){}
   // CHECK-NEXT: OpenACCCombinedConstruct{{.*}} parallel loop
-  // CHECK-NEXT: device_type(SomeS)
-  // CHECK-NEXT: dtype(SomeImpl)
+  // CHECK-NEXT: device_type(*)
+  // CHECK-NEXT: dtype(default)
   // CHECK-NEXT: ForStmt
   // CHECK-NEXT: DeclStmt
   // CHECK-NEXT: VarDecl{{.*}} i 'int'
@@ -36,11 +36,11 @@ void NormalUses() {
   // CHECK-NEXT: UnaryOperator{{.*}}++
   // CHECK-NEXT: DeclRefExpr{{.*}}'i' 'int'
   // CHECK-NEXT: CompoundStmt
-#pragma acc serial loop device_type(SomeVar) dtype(int)
+#pragma acc serial loop device_type(nvidia) dtype(acc_device_nvidia)
   for(int i = 0; i < 5; ++i){}
   // CHECK-NEXT: OpenACCCombinedConstruct{{.*}} serial loop
-  // CHECK-NEXT: device_type(SomeVar)
-  // CHECK-NEXT: dtype(int)
+  // CHECK-NEXT: device_type(nvidia)
+  // CHECK-NEXT: dtype(acc_device_nvidia)
   // CHECK-NEXT: ForStmt
   // CHECK-NEXT: DeclStmt
   // CHECK-NEXT: VarDecl{{.*}} i 'int'
@@ -53,11 +53,11 @@ void NormalUses() {
   // CHECK-NEXT: UnaryOperator{{.*}}++
   // CHECK-NEXT: DeclRefExpr{{.*}}'i' 'int'
   // CHECK-NEXT: CompoundStmt
-#pragma acc kernels loop device_type(private) dtype(struct)
+#pragma acc kernels loop device_type(radeon) dtype(host)
   for(int i = 0; i < 5; ++i){}
   // CHECK-NEXT: OpenACCCombinedConstruct{{.*}} kernels loop
-  // CHECK-NEXT: device_type(private)
-  // CHECK-NEXT: dtype(struct)
+  // CHECK-NEXT: device_type(radeon)
+  // CHECK-NEXT: dtype(host)
   // CHECK-NEXT: ForStmt
   // CHECK-NEXT: DeclStmt
   // CHECK-NEXT: VarDecl{{.*}} i 'int'
@@ -70,11 +70,11 @@ void NormalUses() {
   // CHECK-NEXT: UnaryOperator{{.*}}++
   // CHECK-NEXT: DeclRefExpr{{.*}}'i' 'int'
   // CHECK-NEXT: CompoundStmt
-#pragma acc parallel loop device_type(private) dtype(class)
+#pragma acc parallel loop device_type(multicore) dtype(*)
   for(int i = 0; i < 5; ++i){}
   // CHECK-NEXT: OpenACCCombinedConstruct{{.*}} parallel loop
-  // CHECK-NEXT: device_type(private)
-  // CHECK-NEXT: dtype(class)
+  // CHECK-NEXT: device_type(multicore)
+  // CHECK-NEXT: dtype(*)
   // CHECK-NEXT: ForStmt
   // CHECK-NEXT: DeclStmt
   // CHECK-NEXT: VarDecl{{.*}} i 'int'
@@ -87,10 +87,10 @@ void NormalUses() {
   // CHECK-NEXT: UnaryOperator{{.*}}++
   // CHECK-NEXT: DeclRefExpr{{.*}}'i' 'int'
   // CHECK-NEXT: CompoundStmt
-#pragma acc serial loop device_type(float) dtype(*)
+#pragma acc serial loop device_type(default, nvidia) dtype(*)
   for(int i = 0; i < 5; ++i){}
   // CHECK-NEXT: OpenACCCombinedConstruct{{.*}} serial loop
-  // CHECK-NEXT: device_type(float)
+  // CHECK-NEXT: device_type(default, nvidia)
   // CHECK-NEXT: dtype(*)
   // CHECK-NEXT: ForStmt
   // CHECK-NEXT: DeclStmt
@@ -104,10 +104,10 @@ void NormalUses() {
   // CHECK-NEXT: UnaryOperator{{.*}}++
   // CHECK-NEXT: DeclRefExpr{{.*}}'i' 'int'
   // CHECK-NEXT: CompoundStmt
-#pragma acc kernels loop device_type(float, int) dtype(*)
+#pragma acc kernels loop device_type(acc_device_nvidia, radeon) dtype(*)
   for(int i = 0; i < 5; ++i){}
   // CHECK-NEXT: OpenACCCombinedConstruct{{.*}} kernels loop
-  // CHECK-NEXT: device_type(float, int)
+  // CHECK-NEXT: device_type(acc_device_nvidia, radeon)
   // CHECK-NEXT: dtype(*)
   // CHECK-NEXT: ForStmt
   // CHECK-NEXT: DeclStmt
@@ -129,11 +129,11 @@ void TemplUses() {
   // CHECK-NEXT: TemplateTypeParmDecl{{.*}}T
   // CHECK-NEXT: FunctionDecl{{.*}}TemplUses
   // CHECK-NEXT: CompoundStmt
-#pragma acc parallel loop device_type(T) dtype(T)
+#pragma acc parallel loop device_type(host, multicore) dtype(*)
   for(int i = 0; i < 5; ++i){}
   // CHECK-NEXT: OpenACCCombinedConstruct{{.*}} parallel loop
-  // CHECK-NEXT: device_type(T)
-  // CHECK-NEXT: dtype(T)
+  // CHECK-NEXT: device_type(host, multicore)
+  // CHECK-NEXT: dtype(*)
   // CHECK-NEXT: ForStmt
   // CHECK-NEXT: DeclStmt
   // CHECK-NEXT: VarDecl{{.*}} i 'int'
@@ -155,8 +155,8 @@ void TemplUses() {
   // CHECK-NEXT: CompoundStmt
 
   // CHECK-NEXT: OpenACCCombinedConstruct{{.*}} parallel loop
-  // CHECK-NEXT: device_type(T)
-  // CHECK-NEXT: dtype(T)
+  // CHECK-NEXT: device_type(host, multicore)
+  // CHECK-NEXT: dtype(*)
   // CHECK-NEXT: ForStmt
   // CHECK-NEXT: DeclStmt
   // CHECK-NEXT: VarDecl{{.*}} i 'int'

diff  --git a/clang/test/SemaOpenACC/combined-construct-device_type-clause.c 
b/clang/test/SemaOpenACC/combined-construct-device_type-clause.c
index 38c72551997b8..92174b2d55cf1 100644
--- a/clang/test/SemaOpenACC/combined-construct-device_type-clause.c
+++ b/clang/test/SemaOpenACC/combined-construct-device_type-clause.c
@@ -6,22 +6,22 @@ void uses() {
   typedef struct S{} STy;
   STy SImpl;
 
-#pragma acc parallel loop device_type(I)
+#pragma acc parallel loop device_type(radeon)
   for(int i = 0; i < 5; ++i);
-#pragma acc serial loop device_type(S) dtype(STy)
+#pragma acc serial loop device_type(multicore) dtype(host)
   for(int i = 0; i < 5; ++i);
-#pragma acc kernels loop dtype(SImpl)
+#pragma acc kernels loop dtype(acc_device_nvidia)
   for(int i = 0; i < 5; ++i);
-#pragma acc kernels loop dtype(int) device_type(*)
+#pragma acc kernels loop dtype(default) device_type(*)
   for(int i = 0; i < 5; ++i);
-#pragma acc kernels loop dtype(true) device_type(false)
+#pragma acc kernels loop dtype(nvidia) device_type(radeon)
   for(int i = 0; i < 5; ++i);
 
   // expected-error@+1{{expected identifier}}
-#pragma acc kernels loop dtype(int, *)
+#pragma acc kernels loop dtype(radeon, *)
   for(int i = 0; i < 5; ++i);
 
-#pragma acc parallel loop device_type(I, int)
+#pragma acc parallel loop device_type(host, multicore)
   for(int i = 0; i < 5; ++i);
   // expected-error@+2{{expected ','}}
   // expected-error@+1{{expected identifier}}

diff  --git a/clang/test/SemaOpenACC/combined-construct-device_type-clause.cpp 
b/clang/test/SemaOpenACC/combined-construct-device_type-clause.cpp
index b46709aa8d4ce..c0ed0f90fbe9c 100644
--- a/clang/test/SemaOpenACC/combined-construct-device_type-clause.cpp
+++ b/clang/test/SemaOpenACC/combined-construct-device_type-clause.cpp
@@ -2,17 +2,17 @@
 
 template<typename T>
 void TemplUses() {
-#pragma acc parallel loop device_type(I)
+#pragma acc parallel loop device_type(default)
   for(int i = 0; i < 5; ++i);
 #pragma acc serial loop dtype(*)
   for(int i = 0; i < 5; ++i);
-#pragma acc kernels loop device_type(class)
+#pragma acc kernels loop device_type(nvidia)
   for(int i = 0; i < 5; ++i);
-#pragma acc parallel loop device_type(private)
+#pragma acc parallel loop device_type(radeon)
   for(int i = 0; i < 5; ++i);
-#pragma acc serial loop device_type(bool)
+#pragma acc serial loop device_type(host)
   for(int i = 0; i < 5; ++i);
-#pragma acc kernels loop dtype(true) device_type(false)
+#pragma acc kernels loop dtype(multicore) device_type(host)
   for(int i = 0; i < 5; ++i);
   // expected-error@+2{{expected ','}}
   // expected-error@+1{{expected identifier}}

diff  --git a/clang/test/SemaOpenACC/compute-construct-device_type-ast.cpp 
b/clang/test/SemaOpenACC/compute-construct-device_type-ast.cpp
index 8a2423f4f5427..97bb0a1ee2a14 100644
--- a/clang/test/SemaOpenACC/compute-construct-device_type-ast.cpp
+++ b/clang/test/SemaOpenACC/compute-construct-device_type-ast.cpp
@@ -19,50 +19,50 @@ void NormalUses() {
   // CHECK-NEXT: DeclStmt
   // CHECK-NEXT: VarDecl{{.*}} SomeVar 'bool'
 
-#pragma acc parallel device_type(SomeS) dtype(SomeImpl)
+#pragma acc parallel device_type(default) dtype(nvidia)
   while(true){}
   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
-  // CHECK-NEXT: device_type(SomeS)
-  // CHECK-NEXT: dtype(SomeImpl)
+  // CHECK-NEXT: device_type(default)
+  // CHECK-NEXT: dtype(nvidia)
   // CHECK-NEXT: WhileStmt
   // CHECK-NEXT: CXXBoolLiteralExpr
   // CHECK-NEXT: CompoundStmt
-#pragma acc parallel device_type(SomeVar) dtype(int)
+#pragma acc parallel device_type(radeon) dtype(host)
   while(true){}
   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
-  // CHECK-NEXT: device_type(SomeVar)
-  // CHECK-NEXT: dtype(int)
+  // CHECK-NEXT: device_type(radeon)
+  // CHECK-NEXT: dtype(host)
   // CHECK-NEXT: WhileStmt
   // CHECK-NEXT: CXXBoolLiteralExpr
   // CHECK-NEXT: CompoundStmt
-#pragma acc parallel device_type(private) dtype(struct)
+#pragma acc parallel device_type(multicore) dtype(default)
   while(true){}
   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
-  // CHECK-NEXT: device_type(private)
-  // CHECK-NEXT: dtype(struct)
+  // CHECK-NEXT: device_type(multicore)
+  // CHECK-NEXT: dtype(default)
   // CHECK-NEXT: WhileStmt
   // CHECK-NEXT: CXXBoolLiteralExpr
   // CHECK-NEXT: CompoundStmt
-#pragma acc parallel device_type(private) dtype(class)
+#pragma acc parallel device_type(nvidia) dtype(acc_device_nvidia)
   while(true){}
   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
-  // CHECK-NEXT: device_type(private)
-  // CHECK-NEXT: dtype(class)
+  // CHECK-NEXT: device_type(nvidia)
+  // CHECK-NEXT: dtype(acc_device_nvidia)
   // CHECK-NEXT: WhileStmt
   // CHECK-NEXT: CXXBoolLiteralExpr
   // CHECK-NEXT: CompoundStmt
-#pragma acc parallel device_type(float) dtype(*)
+#pragma acc parallel device_type(radeon) dtype(*)
   while(true){}
   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
-  // CHECK-NEXT: device_type(float)
+  // CHECK-NEXT: device_type(radeon)
   // CHECK-NEXT: dtype(*)
   // CHECK-NEXT: WhileStmt
   // CHECK-NEXT: CXXBoolLiteralExpr
   // CHECK-NEXT: CompoundStmt
-#pragma acc parallel device_type(float, int) dtype(*)
+#pragma acc parallel device_type(host, multicore) dtype(*)
   while(true){}
   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
-  // CHECK-NEXT: device_type(float, int)
+  // CHECK-NEXT: device_type(host, multicore)
   // CHECK-NEXT: dtype(*)
   // CHECK-NEXT: WhileStmt
   // CHECK-NEXT: CXXBoolLiteralExpr
@@ -75,11 +75,11 @@ void TemplUses() {
   // CHECK-NEXT: TemplateTypeParmDecl{{.*}}T
   // CHECK-NEXT: FunctionDecl{{.*}}TemplUses
   // CHECK-NEXT: CompoundStmt
-#pragma acc parallel device_type(T) dtype(T)
+#pragma acc parallel device_type(host) dtype(multicore)
   while(true){}
   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
-  // CHECK-NEXT: device_type(T)
-  // CHECK-NEXT: dtype(T)
+  // CHECK-NEXT: device_type(host)
+  // CHECK-NEXT: dtype(multicore)
   // CHECK-NEXT: WhileStmt
   // CHECK-NEXT: CXXBoolLiteralExpr
   // CHECK-NEXT: CompoundStmt
@@ -92,8 +92,8 @@ void TemplUses() {
   // CHECK-NEXT: CompoundStmt
 
   // CHECK-NEXT: OpenACCComputeConstruct{{.*}}parallel
-  // CHECK-NEXT: device_type(T)
-  // CHECK-NEXT: dtype(T)
+  // CHECK-NEXT: device_type(host)
+  // CHECK-NEXT: dtype(multicore)
   // CHECK-NEXT: WhileStmt
   // CHECK-NEXT: CXXBoolLiteralExpr
   // CHECK-NEXT: CompoundStmt

diff  --git a/clang/test/SemaOpenACC/compute-construct-device_type-clause.c 
b/clang/test/SemaOpenACC/compute-construct-device_type-clause.c
index 1e74e5ac23377..16caa7205721d 100644
--- a/clang/test/SemaOpenACC/compute-construct-device_type-clause.c
+++ b/clang/test/SemaOpenACC/compute-construct-device_type-clause.c
@@ -6,22 +6,22 @@ void uses() {
   typedef struct S{} STy;
   STy SImpl;
 
-#pragma acc parallel device_type(I)
+#pragma acc parallel device_type(radeon)
   while(1);
-#pragma acc serial device_type(S) dtype(STy)
+#pragma acc serial device_type(nvidia) dtype(multicore)
   while(1);
-#pragma acc kernels dtype(SImpl)
+#pragma acc kernels dtype(host)
   while(1);
-#pragma acc kernels dtype(int) device_type(*)
+#pragma acc kernels dtype(default) device_type(*)
   while(1);
-#pragma acc kernels dtype(true) device_type(false)
+#pragma acc kernels dtype(nvidia) device_type(multicore)
   while(1);
 
   // expected-error@+1{{expected identifier}}
-#pragma acc kernels dtype(int, *)
+#pragma acc kernels dtype(default, *)
   while(1);
 
-#pragma acc parallel device_type(I, int)
+#pragma acc parallel device_type(host, radeon)
   while(1);
   // expected-error@+2{{expected ','}}
   // expected-error@+1{{expected identifier}}

diff  --git a/clang/test/SemaOpenACC/compute-construct-device_type-clause.cpp 
b/clang/test/SemaOpenACC/compute-construct-device_type-clause.cpp
index ed40e8bbceae7..1b235fd80667c 100644
--- a/clang/test/SemaOpenACC/compute-construct-device_type-clause.cpp
+++ b/clang/test/SemaOpenACC/compute-construct-device_type-clause.cpp
@@ -2,17 +2,17 @@
 
 template<typename T>
 void TemplUses() {
-#pragma acc parallel device_type(I)
+#pragma acc parallel device_type(default)
   while(true);
 #pragma acc parallel dtype(*)
   while(true);
-#pragma acc parallel device_type(class)
+#pragma acc parallel device_type(nvidia)
   while(true);
-#pragma acc parallel device_type(private)
+#pragma acc parallel device_type(radeon)
   while(true);
-#pragma acc parallel device_type(bool)
+#pragma acc parallel device_type(host)
   while(true);
-#pragma acc kernels dtype(true) device_type(false)
+#pragma acc kernels dtype(multicore) device_type(host)
   while(true);
   // expected-error@+2{{expected ','}}
   // expected-error@+1{{expected identifier}}

diff  --git a/clang/test/SemaOpenACC/data-construct-device_type-ast.cpp 
b/clang/test/SemaOpenACC/data-construct-device_type-ast.cpp
index 1f497bb7afcc4..e558785fe38a5 100644
--- a/clang/test/SemaOpenACC/data-construct-device_type-ast.cpp
+++ b/clang/test/SemaOpenACC/data-construct-device_type-ast.cpp
@@ -13,12 +13,12 @@ void TemplUses() {
   // CHECK-NEXT: FunctionDecl{{.*}}TemplUses
   // CHECK-NEXT: CompoundStmt
 
-#pragma acc data default(none) device_type(T) dtype(T)
+#pragma acc data default(none) device_type(host) dtype(multicore)
   ;
   // CHECK-NEXT: OpenACCDataConstruct{{.*}} data
   // CHECK-NEXT: default(none)
-  // CHECK-NEXT: device_type(T)
-  // CHECK-NEXT: dtype(T)
+  // CHECK-NEXT: device_type(host)
+  // CHECK-NEXT: dtype(multicore)
   // CHECK-NEXT: NullStmt
 
   // Instantiations
@@ -30,8 +30,8 @@ void TemplUses() {
   // Argument to 'device-type' is just an identifier, so we don't transform it.
   // CHECK-NEXT: OpenACCDataConstruct{{.*}} data
   // CHECK-NEXT: default(none)
-  // CHECK-NEXT: device_type(T)
-  // CHECK-NEXT: dtype(T)
+  // CHECK-NEXT: device_type(host)
+  // CHECK-NEXT: dtype(multicore)
   // CHECK-NEXT: NullStmt
 }
 void Inst() {

diff  --git a/clang/test/SemaOpenACC/data-construct-device_type-clause.c 
b/clang/test/SemaOpenACC/data-construct-device_type-clause.c
index a467287b93e0c..e450e320fa53c 100644
--- a/clang/test/SemaOpenACC/data-construct-device_type-clause.c
+++ b/clang/test/SemaOpenACC/data-construct-device_type-clause.c
@@ -2,54 +2,54 @@
 
 void uses() {
   int Var;
-#pragma acc data default(none) device_type(foo) async
+#pragma acc data default(none) device_type(radeon) async
   ;
-#pragma acc data default(none) device_type(foo) wait
+#pragma acc data default(none) device_type(radeon) wait
   ;
-#pragma acc data default(none) device_type(foo) dtype(false)
+#pragma acc data default(none) device_type(radeon) dtype(nvidia)
   ;
-#pragma acc data default(none) dtype(foo) device_type(false)
+#pragma acc data default(none) dtype(radeon) device_type(nvidia)
   ;
 
   // expected-error@+2{{OpenACC clause 'if' may not follow a 'device_type' 
clause in a 'data' construct}}
   // expected-note@+1{{previous clause is here}}
-#pragma acc data default(none) device_type(foo) if(1)
+#pragma acc data default(none) device_type(radeon) if(1)
   ;
   // expected-error@+2{{OpenACC clause 'copy' may not follow a 'device_type' 
clause in a 'data' construct}}
   // expected-note@+1{{previous clause is here}}
-#pragma acc data default(none) device_type(foo) copy(Var)
+#pragma acc data default(none) device_type(radeon) copy(Var)
   ;
   // expected-error@+2{{OpenACC clause 'copyin' may not follow a 'device_type' 
clause in a 'data' construct}}
   // expected-note@+1{{previous clause is here}}
-#pragma acc data default(none) device_type(foo) copyin(Var)
+#pragma acc data default(none) device_type(radeon) copyin(Var)
   ;
   // expected-error@+2{{OpenACC clause 'copyout' may not follow a 
'device_type' clause in a 'data' construct}}
   // expected-note@+1{{previous clause is here}}
-#pragma acc data default(none) device_type(foo) copyout(Var)
+#pragma acc data default(none) device_type(radeon) copyout(Var)
   ;
   // expected-error@+2{{OpenACC clause 'create' may not follow a 'device_type' 
clause in a 'data' construct}}
   // expected-note@+1{{previous clause is here}}
-#pragma acc data default(none) device_type(foo) create(Var)
+#pragma acc data default(none) device_type(radeon) create(Var)
   ;
   // expected-error@+2{{OpenACC clause 'no_create' may not follow a 
'device_type' clause in a 'data' construct}}
   // expected-note@+1{{previous clause is here}}
-#pragma acc data default(none) device_type(foo) no_create(Var)
+#pragma acc data default(none) device_type(radeon) no_create(Var)
   ;
   // expected-error@+2{{OpenACC clause 'present' may not follow a 
'device_type' clause in a 'data' construct}}
   // expected-note@+1{{previous clause is here}}
-#pragma acc data default(none) device_type(foo) present(Var)
+#pragma acc data default(none) device_type(radeon) present(Var)
   ;
   // expected-error@+2{{OpenACC clause 'deviceptr' may not follow a 
'device_type' clause in a 'data' construct}}
   // expected-note@+1{{previous clause is here}}
-#pragma acc data default(none) device_type(foo) deviceptr(Var)
+#pragma acc data default(none) device_type(radeon) deviceptr(Var)
   ;
   // expected-error@+2{{OpenACC clause 'attach' may not follow a 'device_type' 
clause in a 'data' construct}}
   // expected-note@+1{{previous clause is here}}
-#pragma acc data default(none) device_type(foo) attach(Var)
+#pragma acc data default(none) device_type(radeon) attach(Var)
   ;
   // expected-error@+3{{OpenACC 'data' construct must have at least one 
'copy', 'copyin', 'copyout', 'create', 'no_create', 'present', 'deviceptr', 
'attach' or 'default' clause}}
   // expected-error@+2{{OpenACC clause 'default' may not follow a 
'device_type' clause in a 'data' construct}}
   // expected-note@+1{{previous clause is here}}
-#pragma acc data device_type(foo) default(none)
+#pragma acc data device_type(radeon) default(none)
   ;
 }

diff  --git a/clang/test/SemaOpenACC/device_type_valid_values.c 
b/clang/test/SemaOpenACC/device_type_valid_values.c
new file mode 100644
index 0000000000000..7cbe4a67fa468
--- /dev/null
+++ b/clang/test/SemaOpenACC/device_type_valid_values.c
@@ -0,0 +1,56 @@
+// RUN: %clang_cc1 %s -fopenacc -verify 
+
+void foo(int i) {
+#pragma acc parallel device_type(*)
+  ;
+#pragma acc serial device_type(default)
+  ;
+#pragma acc kernels device_type(Default)
+  ;
+#pragma acc data copy(i) device_type(nvidia)
+  ;
+#pragma acc init device_type(acc_device_nvidia)
+  ;
+#pragma acc shutdown device_type(radeon)
+  ;
+#pragma acc set device_type(host)
+  ;
+#pragma acc update self(i) device_type(multicore)
+  ;
+#pragma acc loop device_type(DEFAULT)
+  for(unsigned I = 0; I < 5; ++I);
+#pragma acc parallel loop device_type(HOST)
+  for(unsigned I = 0; I < 5; ++I);
+#pragma acc serial loop device_type(MuLtIcOrE)
+  for(unsigned I = 0; I < 5; ++I);
+#pragma acc kernels loop device_type(radEon)
+  for(unsigned I = 0; I < 5; ++I);
+}
+
+#pragma acc routine(foo) seq device_type(host)
+
+#pragma acc routine seq device_type(acc_device_nvidia)
+void bar(){}
+
+// Anything outside of the above list is invalid.
+void invalid() {
+  // expected-error@+1{{invalid value 'other' in 'device_type' clause; valid 
values are 'default', 'nvidia', 'acc_device_nvidia', 'radeon', 'host', 
'multicore'}}
+#pragma acc parallel device_type(other)
+  ;
+  // expected-error@+1{{invalid value 'invalid' in 'device_type' clause; valid 
values are 'default', 'nvidia', 'acc_device_nvidia', 'radeon', 'host', 
'multicore'}}
+#pragma acc kernels device_type(invalid)
+  ;
+  // expected-error@+1{{invalid value 'invalid' in 'device_type' clause; valid 
values are 'default', 'nvidia', 'acc_device_nvidia', 'radeon', 'host', 
'multicore'}}
+#pragma acc kernels device_type(invalid, nvidia)
+  ;
+  // expected-error@+1{{invalid value 'invalid' in 'device_type' clause; valid 
values are 'default', 'nvidia', 'acc_device_nvidia', 'radeon', 'host', 
'multicore'}}
+#pragma acc kernels device_type(nvidia, invalid)
+  ;
+  // expected-error@+1{{invalid value 'invalid' in 'dtype' clause; valid 
values are 'default', 'nvidia', 'acc_device_nvidia', 'radeon', 'host', 
'multicore'}}
+#pragma acc kernels dtype(nvidia, invalid, radeon)
+  ;
+  // expected-error@+2{{invalid value 'invalid' in 'device_type' clause; valid 
values are 'default', 'nvidia', 'acc_device_nvidia', 'radeon', 'host', 
'multicore'}}
+  // expected-error@+1{{invalid value 'invalid2' in 'device_type' clause; 
valid values are 'default', 'nvidia', 'acc_device_nvidia', 'radeon', 'host', 
'multicore'}}
+#pragma acc kernels device_type(nvidia, invalid, radeon, invalid2)
+  ;
+}

diff  --git a/clang/test/SemaOpenACC/init-construct-ast.cpp 
b/clang/test/SemaOpenACC/init-construct-ast.cpp
index ba0ca1ec36327..64ef8b1428948 100644
--- a/clang/test/SemaOpenACC/init-construct-ast.cpp
+++ b/clang/test/SemaOpenACC/init-construct-ast.cpp
@@ -34,10 +34,10 @@ _Pragma("acc init")
   // CHECK-NEXT: CallExpr
   // CHECK-NEXT: ImplicitCastExpr
   // CHECK-NEXT: DeclRefExpr{{.*}}'some_int' 'int ()'
-#pragma acc init device_type(T)
+#pragma acc init device_type(default)
   // CHECK-NEXT: OpenACCInitConstruct{{.*}}init
-  // CHECK-NEXT: device_type(T)
-#pragma acc init if (some_int() < some_long()) device_type(T) 
device_num(some_int())
+  // CHECK-NEXT: device_type(default)
+#pragma acc init if (some_int() < some_long()) device_type(nvidia) 
device_num(some_int())
   // CHECK-NEXT: OpenACCInitConstruct{{.*}}init
   // CHECK-NEXT: if clause
   // CHECK-NEXT: BinaryOperator{{.*}} 'bool' '<'
@@ -48,7 +48,7 @@ _Pragma("acc init")
   // CHECK-NEXT: CallExpr
   // CHECK-NEXT: ImplicitCastExpr
   // CHECK-NEXT: DeclRefExpr{{.*}}'some_long' 'long ()'
-  // CHECK-NEXT: device_type(T)
+  // CHECK-NEXT: device_type(nvidia)
   // CHECK-NEXT: device_num clause
   // CHECK-NEXT: CallExpr
   // CHECK-NEXT: ImplicitCastExpr
@@ -76,17 +76,17 @@ void TemplFunc(T t) {
   // CHECK-NEXT: OpenACCInitConstruct{{.*}}init
   // CHECK-NEXT: device_num clause
   // CHECK-NEXT: DeclRefExpr{{.*}} 't' 'T'
-#pragma acc init device_type(T)
+#pragma acc init device_type(radeon)
   // CHECK-NEXT: OpenACCInitConstruct{{.*}}init
-  // CHECK-NEXT: device_type(T)
-#pragma acc init if (T::value > t) device_type(T) device_num(t)
+  // CHECK-NEXT: device_type(radeon)
+#pragma acc init if (T::value > t) device_type(host) device_num(t)
   // CHECK-NEXT: OpenACCInitConstruct{{.*}}init
   // CHECK-NEXT: if clause
   // CHECK-NEXT: BinaryOperator{{.*}} '<dependent type>' '>'
   // CHECK-NEXT: DependentScopeDeclRefExpr
   // CHECK-NEXT: NestedNameSpecifier{{.*}} 'T'
   // CHECK-NEXT: DeclRefExpr{{.*}} 't' 'T'
-  // CHECK-NEXT: device_type(T)
+  // CHECK-NEXT: device_type(host)
   // CHECK-NEXT: device_num clause
   // CHECK-NEXT: DeclRefExpr{{.*}} 't' 'T'
 
@@ -119,7 +119,7 @@ void TemplFunc(T t) {
   // CHECK-NEXT: DeclRefExpr{{.*}} 't' 'SomeStruct'
 
   // CHECK-NEXT: OpenACCInitConstruct{{.*}}init
-  // CHECK-NEXT: device_type(T)
+  // CHECK-NEXT: device_type(radeon)
 
   // CHECK-NEXT: OpenACCInitConstruct{{.*}}init
   // CHECK-NEXT: if clause
@@ -131,7 +131,7 @@ void TemplFunc(T t) {
   // CHECK-NEXT: CXXMemberCallExpr{{.*}} 'unsigned int'
   // CHECK-NEXT: MemberExpr{{.*}} .operator unsigned int
   // CHECK-NEXT: DeclRefExpr{{.*}} 't' 'SomeStruct'
-  // CHECK-NEXT: device_type(T)
+  // CHECK-NEXT: device_type(host)
   // CHECK-NEXT: device_num clause
   // CHECK-NEXT: ImplicitCastExpr{{.*}}'unsigned int'
   // CHECK-NEXT: CXXMemberCallExpr{{.*}}'unsigned int'

diff  --git a/clang/test/SemaOpenACC/init-construct.cpp 
b/clang/test/SemaOpenACC/init-construct.cpp
index e4491ee905f3f..2cbe5f1ded04a 100644
--- a/clang/test/SemaOpenACC/init-construct.cpp
+++ b/clang/test/SemaOpenACC/init-construct.cpp
@@ -18,9 +18,9 @@ void uses() {
 #pragma acc init
 #pragma acc init if (getI() < getS())
 #pragma acc init device_num(getI())
-#pragma acc init device_type(SOMETHING) device_num(getI())
-#pragma acc init device_type(SOMETHING) if (getI() < getS())
-#pragma acc init device_type(SOMETHING) device_num(getI()) if (getI() < getS())
+#pragma acc init device_type(host) device_num(getI())
+#pragma acc init device_type(nvidia) if (getI() < getS())
+#pragma acc init device_type(multicore) device_num(getI()) if (getI() < getS())
 
   // expected-error@+1{{value of type 'struct NotConvertible' is not 
contextually convertible to 'bool'}}
 #pragma acc init if (NC)
@@ -41,8 +41,8 @@ void TestInst() {
   T t;
 #pragma acc init
 #pragma acc init if (T::value < T{})
-#pragma acc init device_type(SOMETHING) device_num(getI()) if (getI() < getS())
-#pragma acc init device_type(SOMETHING) device_type(T) device_num(t) if (t < 
T::value) device_num(getI()) if (getI() < getS())
+#pragma acc init device_type(radeon) device_num(getI()) if (getI() < getS())
+#pragma acc init device_type(multicore) device_type(host) device_num(t) if (t 
< T::value) device_num(getI()) if (getI() < getS())
 
   // expected-error@+1{{value of type 'const NotConvertible' is not 
contextually convertible to 'bool'}}
 #pragma acc init if (T::NCValue)

diff  --git a/clang/test/SemaOpenACC/loop-construct-device_type-ast.cpp 
b/clang/test/SemaOpenACC/loop-construct-device_type-ast.cpp
index 0030750a20db3..c69fd49ee00e9 100644
--- a/clang/test/SemaOpenACC/loop-construct-device_type-ast.cpp
+++ b/clang/test/SemaOpenACC/loop-construct-device_type-ast.cpp
@@ -19,11 +19,11 @@ void NormalUses() {
   // CHECK-NEXT: DeclStmt
   // CHECK-NEXT: VarDecl{{.*}} SomeVar 'bool'
 
-#pragma acc loop device_type(SomeS) dtype(SomeImpl)
+#pragma acc loop device_type(default) dtype(nvidia)
   for(int i = 0; i < 5; ++i){}
   // CHECK-NEXT: OpenACCLoopConstruct{{.*}}
-  // CHECK-NEXT: device_type(SomeS)
-  // CHECK-NEXT: dtype(SomeImpl)
+  // CHECK-NEXT: device_type(default)
+  // CHECK-NEXT: dtype(nvidia)
   // CHECK-NEXT: ForStmt
   // CHECK-NEXT: DeclStmt
   // CHECK-NEXT: VarDecl{{.*}} i 'int'
@@ -36,11 +36,11 @@ void NormalUses() {
   // CHECK-NEXT: UnaryOperator{{.*}}++
   // CHECK-NEXT: DeclRefExpr{{.*}}'i' 'int'
   // CHECK-NEXT: CompoundStmt
-#pragma acc loop device_type(SomeVar) dtype(int)
+#pragma acc loop device_type(acc_device_nvidia) dtype(radeon)
   for(int i = 0; i < 5; ++i){}
   // CHECK-NEXT: OpenACCLoopConstruct{{.*}}
-  // CHECK-NEXT: device_type(SomeVar)
-  // CHECK-NEXT: dtype(int)
+  // CHECK-NEXT: device_type(acc_device_nvidia)
+  // CHECK-NEXT: dtype(radeon)
   // CHECK-NEXT: ForStmt
   // CHECK-NEXT: DeclStmt
   // CHECK-NEXT: VarDecl{{.*}} i 'int'
@@ -53,11 +53,11 @@ void NormalUses() {
   // CHECK-NEXT: UnaryOperator{{.*}}++
   // CHECK-NEXT: DeclRefExpr{{.*}}'i' 'int'
   // CHECK-NEXT: CompoundStmt
-#pragma acc loop device_type(private) dtype(struct)
+#pragma acc loop device_type(host) dtype(multicore)
   for(int i = 0; i < 5; ++i){}
   // CHECK-NEXT: OpenACCLoopConstruct{{.*}}
-  // CHECK-NEXT: device_type(private)
-  // CHECK-NEXT: dtype(struct)
+  // CHECK-NEXT: device_type(host)
+  // CHECK-NEXT: dtype(multicore)
   // CHECK-NEXT: ForStmt
   // CHECK-NEXT: DeclStmt
   // CHECK-NEXT: VarDecl{{.*}} i 'int'
@@ -70,11 +70,11 @@ void NormalUses() {
   // CHECK-NEXT: UnaryOperator{{.*}}++
   // CHECK-NEXT: DeclRefExpr{{.*}}'i' 'int'
   // CHECK-NEXT: CompoundStmt
-#pragma acc loop device_type(private) dtype(class)
+#pragma acc loop device_type(default) dtype(*)
   for(int i = 0; i < 5; ++i){}
   // CHECK-NEXT: OpenACCLoopConstruct{{.*}}
-  // CHECK-NEXT: device_type(private)
-  // CHECK-NEXT: dtype(class)
+  // CHECK-NEXT: device_type(default)
+  // CHECK-NEXT: dtype(*)
   // CHECK-NEXT: ForStmt
   // CHECK-NEXT: DeclStmt
   // CHECK-NEXT: VarDecl{{.*}} i 'int'
@@ -87,10 +87,10 @@ void NormalUses() {
   // CHECK-NEXT: UnaryOperator{{.*}}++
   // CHECK-NEXT: DeclRefExpr{{.*}}'i' 'int'
   // CHECK-NEXT: CompoundStmt
-#pragma acc loop device_type(float) dtype(*)
+#pragma acc loop device_type(nvidia) dtype(*)
   for(int i = 0; i < 5; ++i){}
   // CHECK-NEXT: OpenACCLoopConstruct{{.*}}
-  // CHECK-NEXT: device_type(float)
+  // CHECK-NEXT: device_type(nvidia)
   // CHECK-NEXT: dtype(*)
   // CHECK-NEXT: ForStmt
   // CHECK-NEXT: DeclStmt
@@ -104,10 +104,10 @@ void NormalUses() {
   // CHECK-NEXT: UnaryOperator{{.*}}++
   // CHECK-NEXT: DeclRefExpr{{.*}}'i' 'int'
   // CHECK-NEXT: CompoundStmt
-#pragma acc loop device_type(float, int) dtype(*)
+#pragma acc loop device_type(radeon, host) dtype(*)
   for(int i = 0; i < 5; ++i){}
   // CHECK-NEXT: OpenACCLoopConstruct{{.*}}
-  // CHECK-NEXT: device_type(float, int)
+  // CHECK-NEXT: device_type(radeon, host)
   // CHECK-NEXT: dtype(*)
   // CHECK-NEXT: ForStmt
   // CHECK-NEXT: DeclStmt
@@ -129,11 +129,11 @@ void TemplUses() {
   // CHECK-NEXT: TemplateTypeParmDecl{{.*}}T
   // CHECK-NEXT: FunctionDecl{{.*}}TemplUses
   // CHECK-NEXT: CompoundStmt
-#pragma acc loop device_type(T) dtype(T)
+#pragma acc loop device_type(default) dtype(multicore)
   for(int i = 0; i < 5; ++i){}
   // CHECK-NEXT: OpenACCLoopConstruct{{.*}}
-  // CHECK-NEXT: device_type(T)
-  // CHECK-NEXT: dtype(T)
+  // CHECK-NEXT: device_type(default)
+  // CHECK-NEXT: dtype(multicore)
   // CHECK-NEXT: ForStmt
   // CHECK-NEXT: DeclStmt
   // CHECK-NEXT: VarDecl{{.*}} i 'int'
@@ -155,8 +155,8 @@ void TemplUses() {
   // CHECK-NEXT: CompoundStmt
 
   // CHECK-NEXT: OpenACCLoopConstruct{{.*}}
-  // CHECK-NEXT: device_type(T)
-  // CHECK-NEXT: dtype(T)
+  // CHECK-NEXT: device_type(default)
+  // CHECK-NEXT: dtype(multicore)
   // CHECK-NEXT: ForStmt
   // CHECK-NEXT: DeclStmt
   // CHECK-NEXT: VarDecl{{.*}} i 'int'

diff  --git a/clang/test/SemaOpenACC/loop-construct-device_type-clause.c 
b/clang/test/SemaOpenACC/loop-construct-device_type-clause.c
index 5c5e76881a889..24da7ed88ff70 100644
--- a/clang/test/SemaOpenACC/loop-construct-device_type-clause.c
+++ b/clang/test/SemaOpenACC/loop-construct-device_type-clause.c
@@ -6,22 +6,22 @@ void uses() {
   typedef struct S{} STy;
   STy SImpl;
 
-#pragma acc loop device_type(I)
+#pragma acc loop device_type(radeon)
   for(int i = 0; i < 5; ++i);
-#pragma acc loop device_type(S) dtype(STy)
+#pragma acc loop device_type(host) dtype(multicore)
   for(int i = 0; i < 5; ++i);
-#pragma acc loop dtype(SImpl)
+#pragma acc loop dtype(nvidia)
   for(int i = 0; i < 5; ++i);
-#pragma acc loop dtype(int) device_type(*)
+#pragma acc loop dtype(default) device_type(*)
   for(int i = 0; i < 5; ++i);
-#pragma acc loop dtype(true) device_type(false)
+#pragma acc loop dtype(radeon) device_type(nvidia)
   for(int i = 0; i < 5; ++i);
 
   // expected-error@+1{{expected identifier}}
 #pragma acc loop dtype(int, *)
   for(int i = 0; i < 5; ++i);
 
-#pragma acc loop device_type(I, int)
+#pragma acc loop device_type(default, nvidia)
   for(int i = 0; i < 5; ++i);
   // expected-error@+2{{expected ','}}
   // expected-error@+1{{expected identifier}}

diff  --git a/clang/test/SemaOpenACC/loop-construct-device_type-clause.cpp 
b/clang/test/SemaOpenACC/loop-construct-device_type-clause.cpp
index 57c70dd79d5e2..257e0cc75fad2 100644
--- a/clang/test/SemaOpenACC/loop-construct-device_type-clause.cpp
+++ b/clang/test/SemaOpenACC/loop-construct-device_type-clause.cpp
@@ -2,17 +2,17 @@
 
 template<typename T>
 void TemplUses() {
-#pragma acc loop device_type(I)
+#pragma acc loop device_type(host)
   for(int i = 0; i < 5; ++i);
 #pragma acc loop dtype(*)
   for(int i = 0; i < 5; ++i);
-#pragma acc loop device_type(class)
+#pragma acc loop device_type(default)
   for(int i = 0; i < 5; ++i);
-#pragma acc loop device_type(private)
+#pragma acc loop device_type(multicore)
   for(int i = 0; i < 5; ++i);
-#pragma acc loop device_type(bool)
+#pragma acc loop device_type(host)
   for(int i = 0; i < 5; ++i);
-#pragma acc kernels dtype(true) device_type(false)
+#pragma acc kernels dtype(radeon) device_type(nvidia)
   for(int i = 0; i < 5; ++i);
   // expected-error@+2{{expected ','}}
   // expected-error@+1{{expected identifier}}

diff  --git a/clang/test/SemaOpenACC/routine-construct-ast.cpp 
b/clang/test/SemaOpenACC/routine-construct-ast.cpp
index 068d99123522e..dfdcc321b94dd 100644
--- a/clang/test/SemaOpenACC/routine-construct-ast.cpp
+++ b/clang/test/SemaOpenACC/routine-construct-ast.cpp
@@ -24,16 +24,16 @@ int function();
 // CHECK-NEXT: vector clause
 // CHECK-NEXT: bind clause identifier 'identifier'
 
-#pragma acc routine(function) device_type(Something) seq
+#pragma acc routine(function) device_type(acc_device_nvidia) seq
 // CHECK-NEXT: OpenACCRoutineDecl{{.*}} routine
 // CHECK-NEXT: DeclRefExpr{{.*}} 'function' 'int ()'
-// CHECK-NEXT: device_type(Something)
+// CHECK-NEXT: device_type(acc_device_nvidia)
 // CHECK-NEXT: seq clause
-#pragma acc routine(function) nohost dtype(Something) vector
+#pragma acc routine(function) nohost dtype(nvidia) vector
 // CHECK-NEXT: OpenACCRoutineDecl{{.*}} routine
 // CHECK-NEXT: DeclRefExpr{{.*}} 'function' 'int ()'
 // CHECK-NEXT: nohost clause
-// CHECK-NEXT: dtype(Something)
+// CHECK-NEXT: dtype(nvidia)
 // CHECK-NEXT: vector clause
 
 #pragma acc routine nohost vector
@@ -172,15 +172,15 @@ struct S {
 // CHECK-NEXT: OpenACCRoutineDecl{{.*}} routine
 // CHECK-NEXT: DeclRefExpr{{.*}} 'Lambda' 'const S::(lambda at
 // CHECK-NEXT: worker clause
-#pragma acc routine(Lambda) worker device_type(Lambda)
+#pragma acc routine(Lambda) worker device_type(host)
 // CHECK-NEXT: OpenACCRoutineDecl{{.*}} routine
 // CHECK-NEXT: DeclRefExpr{{.*}} 'Lambda' 'const S::(lambda at
 // CHECK-NEXT: worker clause
-// CHECK-NEXT: device_type(Lambda)
-#pragma acc routine(Lambda) dtype(Lambda) vector
+// CHECK-NEXT: device_type(host)
+#pragma acc routine(Lambda) dtype(radeon) vector
 // CHECK-NEXT: OpenACCRoutineDecl{{.*}} routine
 // CHECK-NEXT: DeclRefExpr{{.*}} 'Lambda' 'const S::(lambda at
-// CHECK-NEXT: dtype(Lambda)
+// CHECK-NEXT: dtype(radeon)
 // CHECK-NEXT: vector clause
 };
 
@@ -294,12 +294,12 @@ struct DepS {
 // CHECK-NEXT: DeclRefExpr{{.*}} 'StaticMemFunc' 'T ()'
 // CHECK-NEXT: NestedNameSpecifier{{.*}} 'DepS<T>'
 // CHECK-NEXT: worker clause
-#pragma acc routine(DepS<T>::StaticMemFunc) worker device_type(T)
+#pragma acc routine(DepS<T>::StaticMemFunc) worker device_type(multicore)
 // CHECK-NEXT: OpenACCRoutineDecl{{.*}} routine 
 // CHECK-NEXT: DeclRefExpr{{.*}} 'StaticMemFunc' 'T ()'
 // CHECK-NEXT: NestedNameSpecifier{{.*}} 'DepS<T>'
 // CHECK-NEXT: worker clause
-// CHECK-NEXT: device_type(T)
+// CHECK-NEXT: device_type(multicore)
 
 // Instantiation:
 // CHECK: ClassTemplateSpecializationDecl{{.*}}struct DepS
@@ -398,7 +398,7 @@ struct DepS {
 // CHECK-NEXT: DeclRefExpr{{.*}} 'StaticMemFunc' 'int ()'
 // CHECK-NEXT: NestedNameSpecifier{{.*}} 'DepS<int>'
 // CHECK-NEXT: worker clause
-// CHECK-NEXT: device_type(T)
+// CHECK-NEXT: device_type(multicore)
 };
 
 #pragma acc routine(DepS<int>::Lambda) gang(dim:1)

diff  --git a/clang/test/SemaOpenACC/routine-construct-clauses.cpp 
b/clang/test/SemaOpenACC/routine-construct-clauses.cpp
index 78554fa70292a..b9fc46aeff092 100644
--- a/clang/test/SemaOpenACC/routine-construct-clauses.cpp
+++ b/clang/test/SemaOpenACC/routine-construct-clauses.cpp
@@ -139,8 +139,8 @@ void Inst() {
   DependentT<HasFuncs> T;// expected-note{{in instantiation of}}
 }
 
-#pragma acc routine(Func) gang device_type(Inst)
-#pragma acc routine(Func) gang dtype(Inst)
+#pragma acc routine(Func) gang device_type(host)
+#pragma acc routine(Func) gang dtype(multicore)
 #pragma acc routine(Func) device_type(*) worker
 #pragma acc routine(Func) dtype(*) worker
 

diff  --git a/clang/test/SemaOpenACC/set-construct-ast.cpp 
b/clang/test/SemaOpenACC/set-construct-ast.cpp
index c5eed944ada77..69a750fb0284b 100644
--- a/clang/test/SemaOpenACC/set-construct-ast.cpp
+++ b/clang/test/SemaOpenACC/set-construct-ast.cpp
@@ -13,7 +13,7 @@ void NormalFunc() {
   // CHECK-LABEL: NormalFunc
   // CHECK-NEXT: CompoundStmt
 
-#pragma acc set default_async(some_int()) device_num(some_long()) 
device_type(DT) if (some_int() < some_long())
+#pragma acc set default_async(some_int()) device_num(some_long()) 
device_type(acc_device_nvidia) if (some_int() < some_long())
   // CHECK-NEXT: OpenACCSetConstruct{{.*}}set
   // CHECK-NEXT: default_async clause
   // CHECK-NEXT: CallExpr{{.*}}'int'
@@ -23,7 +23,7 @@ void NormalFunc() {
   // CHECK-NEXT: CallExpr{{.*}} 'long'
   // CHECK-NEXT: ImplicitCastExpr
   // CHECK-NEXT: DeclRefExpr{{.*}}'some_long' 'long ()'
-  // CHECK-NEXT: device_type(DT)
+  // CHECK-NEXT: device_type(acc_device_nvidia)
   // CHECK-NEXT: if clause
   // CHECK-NEXT: BinaryOperator{{.*}}'bool' '<'
   // CHECK-NEXT: ImplicitCastExpr{{.*}}'long'
@@ -43,14 +43,14 @@ void TemplFunc(T t) {
   // CHECK-NEXT: ParmVarDecl{{.*}} t 'T'
   // CHECK-NEXT: CompoundStmt
 
-#pragma acc set default_async(T::value) device_num(t) device_type(DT) if 
(T::value < t)
+#pragma acc set default_async(T::value) device_num(t) device_type(multicore) 
if (T::value < t)
   // CHECK-NEXT: OpenACCSetConstruct{{.*}}set
   // CHECK-NEXT: default_async clause
   // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>'
   // CHECK-NEXT: NestedNameSpecifier TypeSpec 'T'
   // CHECK-NEXT: device_num clause
   // CHECK-NEXT: DeclRefExpr{{.*}}'t' 'T'
-  // CHECK-NEXT: device_type(DT)
+  // CHECK-NEXT: device_type(multicore)
   // CHECK-NEXT: if clause
   // CHECK-NEXT: BinaryOperator{{.*}}'<dependent type>' '<'
   // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>'
@@ -75,7 +75,7 @@ void TemplFunc(T t) {
   // CHECK-NEXT: CXXMemberCallExpr{{.*}}'unsigned int'
   // CHECK-NEXT: MemberExpr{{.*}}.operator unsigned int
   // CHECK-NEXT: DeclRefExpr{{.*}}'t' 'SomeStruct'
-  // CHECK-NEXT: device_type(DT)
+  // CHECK-NEXT: device_type(multicore)
   // CHECK-NEXT: if clause
   // CHECK-NEXT: BinaryOperator{{.*}}'bool' '<'
   // CHECK-NEXT: ImplicitCastExpr {{.*}}'unsigned int'

diff  --git a/clang/test/SemaOpenACC/set-construct.cpp 
b/clang/test/SemaOpenACC/set-construct.cpp
index 23816dbab2911..9a90ea67b1bd2 100644
--- a/clang/test/SemaOpenACC/set-construct.cpp
+++ b/clang/test/SemaOpenACC/set-construct.cpp
@@ -17,11 +17,11 @@ struct ExplicitConvertOnly {
 void uses() {
 #pragma acc set default_async(getI())
 #pragma acc set device_num(getI())
-#pragma acc set device_type(getI)
-#pragma acc set device_type(getI) if (getI() < getS())
+#pragma acc set device_type(multicore)
+#pragma acc set device_type(host) if (getI() < getS())
 
   // expected-error@+1{{value of type 'struct NotConvertible' is not 
contextually convertible to 'bool'}}
-#pragma acc set if (NC) device_type(I)
+#pragma acc set if (NC) device_type(radeon)
 
   // expected-error@+2{{OpenACC 'set' construct must have at least one 
'default_async', 'device_num', 'device_type' or 'if' clause}}
   // expected-error@+1{{OpenACC clause 'device_num' requires expression of 
integer type ('struct NotConvertible' invalid)}}
@@ -62,8 +62,8 @@ void uses() {
 
   // expected-error@+2{{'device_type' clause cannot appear more than once on a 
'set' directive}}
   // expected-note@+1{{previous clause is here}}
-#pragma acc set device_type(I) device_type(I)
+#pragma acc set device_type(nvidia) device_type(default)
   // expected-error@+2{{'if' clause cannot appear more than once on a 'set' 
directive}}
   // expected-note@+1{{previous clause is here}}
-#pragma acc set device_type(I) if(true) if (true)
+#pragma acc set device_type(acc_device_nvidia) if(true) if (true)
 }

diff  --git a/clang/test/SemaOpenACC/shutdown-construct-ast.cpp 
b/clang/test/SemaOpenACC/shutdown-construct-ast.cpp
index 13f345799e0cd..9cc72b3af891d 100644
--- a/clang/test/SemaOpenACC/shutdown-construct-ast.cpp
+++ b/clang/test/SemaOpenACC/shutdown-construct-ast.cpp
@@ -34,10 +34,10 @@ _Pragma("acc shutdown")
   // CHECK-NEXT: CallExpr
   // CHECK-NEXT: ImplicitCastExpr
   // CHECK-NEXT: DeclRefExpr{{.*}}'some_int' 'int ()'
-#pragma acc shutdown device_type(T)
+#pragma acc shutdown device_type(multicore)
   // CHECK-NEXT: OpenACCShutdownConstruct{{.*}}shutdown
-  // CHECK-NEXT: device_type(T)
-#pragma acc shutdown if (some_int() < some_long()) device_type(T) 
device_num(some_int())
+  // CHECK-NEXT: device_type(multicore)
+#pragma acc shutdown if (some_int() < some_long()) device_type(host) 
device_num(some_int())
   // CHECK-NEXT: OpenACCShutdownConstruct{{.*}}shutdown
   // CHECK-NEXT: if clause
   // CHECK-NEXT: BinaryOperator{{.*}} 'bool' '<'
@@ -48,7 +48,7 @@ _Pragma("acc shutdown")
   // CHECK-NEXT: CallExpr
   // CHECK-NEXT: ImplicitCastExpr
   // CHECK-NEXT: DeclRefExpr{{.*}}'some_long' 'long ()'
-  // CHECK-NEXT: device_type(T)
+  // CHECK-NEXT: device_type(host)
   // CHECK-NEXT: device_num clause
   // CHECK-NEXT: CallExpr
   // CHECK-NEXT: ImplicitCastExpr
@@ -76,17 +76,17 @@ void TemplFunc(T t) {
   // CHECK-NEXT: OpenACCShutdownConstruct{{.*}}shutdown
   // CHECK-NEXT: device_num clause
   // CHECK-NEXT: DeclRefExpr{{.*}} 't' 'T'
-#pragma acc shutdown device_type(T)
+#pragma acc shutdown device_type(radeon)
   // CHECK-NEXT: OpenACCShutdownConstruct{{.*}}shutdown
-  // CHECK-NEXT: device_type(T)
-#pragma acc shutdown if (T::value > t) device_type(T) device_num(t)
+  // CHECK-NEXT: device_type(radeon)
+#pragma acc shutdown if (T::value > t) device_type(acc_device_nvidia) 
device_num(t)
   // CHECK-NEXT: OpenACCShutdownConstruct{{.*}}shutdown
   // CHECK-NEXT: if clause
   // CHECK-NEXT: BinaryOperator{{.*}} '<dependent type>' '>'
   // CHECK-NEXT: DependentScopeDeclRefExpr
   // CHECK-NEXT: NestedNameSpecifier{{.*}} 'T'
   // CHECK-NEXT: DeclRefExpr{{.*}} 't' 'T'
-  // CHECK-NEXT: device_type(T)
+  // CHECK-NEXT: device_type(acc_device_nvidia)
   // CHECK-NEXT: device_num clause
   // CHECK-NEXT: DeclRefExpr{{.*}} 't' 'T'
 
@@ -119,7 +119,7 @@ void TemplFunc(T t) {
   // CHECK-NEXT: DeclRefExpr{{.*}} 't' 'SomeStruct'
 
   // CHECK-NEXT: OpenACCShutdownConstruct{{.*}}shutdown
-  // CHECK-NEXT: device_type(T)
+  // CHECK-NEXT: device_type(radeon)
 
   // CHECK-NEXT: OpenACCShutdownConstruct{{.*}}shutdown
   // CHECK-NEXT: if clause
@@ -131,7 +131,7 @@ void TemplFunc(T t) {
   // CHECK-NEXT: CXXMemberCallExpr{{.*}} 'unsigned int'
   // CHECK-NEXT: MemberExpr{{.*}} .operator unsigned int
   // CHECK-NEXT: DeclRefExpr{{.*}} 't' 'SomeStruct'
-  // CHECK-NEXT: device_type(T)
+  // CHECK-NEXT: device_type(acc_device_nvidia)
   // CHECK-NEXT: device_num clause
   // CHECK-NEXT: ImplicitCastExpr{{.*}}'unsigned int'
   // CHECK-NEXT: CXXMemberCallExpr{{.*}}'unsigned int'

diff  --git a/clang/test/SemaOpenACC/shutdown-construct.cpp 
b/clang/test/SemaOpenACC/shutdown-construct.cpp
index c3390b0412873..b167ac66c85d9 100644
--- a/clang/test/SemaOpenACC/shutdown-construct.cpp
+++ b/clang/test/SemaOpenACC/shutdown-construct.cpp
@@ -18,9 +18,9 @@ void uses() {
 #pragma acc shutdown
 #pragma acc shutdown if (getI() < getS())
 #pragma acc shutdown device_num(getI())
-#pragma acc shutdown device_type(SOMETHING) device_num(getI())
-#pragma acc shutdown device_type(SOMETHING) if (getI() < getS())
-#pragma acc shutdown device_type(SOMETHING) device_num(getI()) if (getI() < 
getS())
+#pragma acc shutdown device_type(host) device_num(getI())
+#pragma acc shutdown device_type(nvidia) if (getI() < getS())
+#pragma acc shutdown device_type(radeon) device_num(getI()) if (getI() < 
getS())
 
   // expected-error@+1{{value of type 'struct NotConvertible' is not 
contextually convertible to 'bool'}}
 #pragma acc shutdown if (NC)
@@ -41,8 +41,8 @@ void TestInst() {
   T t;
 #pragma acc shutdown
 #pragma acc shutdown if (T::value < T{})
-#pragma acc shutdown device_type(SOMETHING) device_num(getI()) if (getI() < 
getS())
-#pragma acc shutdown device_type(SOMETHING) device_type(T) device_num(t) if (t 
< T::value) device_num(getI()) if (getI() < getS())
+#pragma acc shutdown device_type(multicore) device_num(getI()) if (getI() < 
getS())
+#pragma acc shutdown device_type(default) device_type(radeon) device_num(t) if 
(t < T::value) device_num(getI()) if (getI() < getS())
 
   // expected-error@+1{{value of type 'const NotConvertible' is not 
contextually convertible to 'bool'}}
 #pragma acc shutdown if (T::NCValue)

diff  --git a/clang/test/SemaOpenACC/update-construct-ast.cpp 
b/clang/test/SemaOpenACC/update-construct-ast.cpp
index 4238f93d90a34..de7f4da589edd 100644
--- a/clang/test/SemaOpenACC/update-construct-ast.cpp
+++ b/clang/test/SemaOpenACC/update-construct-ast.cpp
@@ -33,15 +33,15 @@ void NormalFunc() {
   // CHECK-NEXT: ImplicitCastExpr
   // CHECK-NEXT: DeclRefExpr{{.*}}'some_long' 'long ()'
 
-#pragma acc update self(Global) wait async device_type(A) dtype(B)
+#pragma acc update self(Global) wait async device_type(nvidia) dtype(radeon)
   // CHECK-NEXT: OpenACCUpdateConstruct{{.*}}update
   // CHECK-NEXT: self clause
   // CHECK-NEXT: DeclRefExpr{{.*}}'Global' 'int'
   // CHECK-NEXT: wait clause
   // CHECK-NEXT: <<<NULL>>>
   // CHECK-NEXT: async clause
-  // CHECK-NEXT: device_type(A)
-  // CHECK-NEXT: dtype(B)
+  // CHECK-NEXT: device_type(nvidia)
+  // CHECK-NEXT: dtype(radeon)
 #pragma acc update self(Global) wait(some_int(), some_long()) async(some_int())
   // CHECK-NEXT: OpenACCUpdateConstruct{{.*}}update
   // CHECK-NEXT: self clause
@@ -147,15 +147,15 @@ void TemplFunc(T t) {
   // CHECK-NEXT: NestedNameSpecifier TypeSpec 'T'
   // CHECK-NEXT: DeclRefExpr{{.*}}'t' 'T'
 
-#pragma acc update self(t) wait async device_type(T) dtype(U)
+#pragma acc update self(t) wait async device_type(default) dtype(host)
   // CHECK-NEXT: OpenACCUpdateConstruct{{.*}}update
   // CHECK-NEXT: self clause
   // CHECK-NEXT: DeclRefExpr{{.*}} 't' 'T'
   // CHECK-NEXT: wait clause
   // CHECK-NEXT: <<<NULL>>>
   // CHECK-NEXT: async clause
-  // CHECK-NEXT: device_type(T)
-  // CHECK-NEXT: dtype(U)
+  // CHECK-NEXT: device_type(default)
+  // CHECK-NEXT: dtype(host)
 #pragma acc update self(t) wait(T::value, t) async(T::value)
   // CHECK-NEXT: OpenACCUpdateConstruct{{.*}}update
   // CHECK-NEXT: self clause
@@ -261,8 +261,8 @@ void TemplFunc(T t) {
   // CHECK-NEXT: wait clause
   // CHECK-NEXT: <<<NULL>>>
   // CHECK-NEXT: async clause
-  // CHECK-NEXT: device_type(T)
-  // CHECK-NEXT: dtype(U)
+  // CHECK-NEXT: device_type(default)
+  // CHECK-NEXT: dtype(host)
 
   // CHECK-NEXT: OpenACCUpdateConstruct{{.*}}update
   // CHECK-NEXT: self clause

diff  --git a/clang/test/SemaOpenACC/update-construct.cpp 
b/clang/test/SemaOpenACC/update-construct.cpp
index 92a8f3a0e2d4c..f0372736452df 100644
--- a/clang/test/SemaOpenACC/update-construct.cpp
+++ b/clang/test/SemaOpenACC/update-construct.cpp
@@ -6,7 +6,7 @@ void uses() {
   int Var;
 #pragma acc update async self(Var)
 #pragma acc update wait self(Var)
-#pragma acc update self(Var) device_type(I)
+#pragma acc update self(Var) device_type(host)
 #pragma acc update if(true) self(Var)
 #pragma acc update if_present self(Var)
 #pragma acc update self(Var)
@@ -15,24 +15,24 @@ void uses() {
 
   // expected-error@+2{{OpenACC clause 'if' may not follow a 'device_type' 
clause in a 'update' construct}}
   // expected-note@+1{{previous clause is here}}
-#pragma acc update self(Var) device_type(I) if(true)
+#pragma acc update self(Var) device_type(default) if(true)
   // expected-error@+2{{OpenACC clause 'if_present' may not follow a 
'device_type' clause in a 'update' construct}}
   // expected-note@+1{{previous clause is here}}
-#pragma acc update self(Var) device_type(I) if_present
+#pragma acc update self(Var) device_type(multicore) if_present
   // expected-error@+2{{OpenACC clause 'self' may not follow a 'device_type' 
clause in a 'update' construct}}
   // expected-note@+1{{previous clause is here}}
-#pragma acc update self(Var) device_type(I) self(Var)
+#pragma acc update self(Var) device_type(nvidia) self(Var)
   // expected-error@+2{{OpenACC clause 'host' may not follow a 'device_type' 
clause in a 'update' construct}}
   // expected-note@+1{{previous clause is here}}
-#pragma acc update self(Var) device_type(I) host(Var)
+#pragma acc update self(Var) device_type(radeon) host(Var)
   // expected-error@+2{{OpenACC clause 'device' may not follow a 'device_type' 
clause in a 'update' construct}}
   // expected-note@+1{{previous clause is here}}
-#pragma acc update self(Var) device_type(I) device(Var)
+#pragma acc update self(Var) device_type(multicore) device(Var)
   // These 2 are OK.
-#pragma acc update self(Var) device_type(I) async
-#pragma acc update self(Var) device_type(I) wait
+#pragma acc update self(Var) device_type(default) async
+#pragma acc update self(Var) device_type(nvidia) wait
   // Unless otherwise specified, we assume 'device_type' can happen after 
itself.
-#pragma acc update self(Var) device_type(I) device_type(I)
+#pragma acc update self(Var) device_type(acc_device_nvidia) 
device_type(multicore)
 
   // These diagnose because there isn't at least 1 of 'self', 'host', or
   // 'device'.
@@ -41,14 +41,14 @@ void uses() {
   // expected-error@+1{{OpenACC 'update' construct must have at least one 
'self', 'host' or 'device' clause}}
 #pragma acc update wait
   // expected-error@+1{{OpenACC 'update' construct must have at least one 
'self', 'host' or 'device' clause}}
-#pragma acc update device_type(I)
+#pragma acc update device_type(host)
   // expected-error@+1{{OpenACC 'update' construct must have at least one 
'self', 'host' or 'device' clause}}
 #pragma acc update if(true)
   // expected-error@+1{{OpenACC 'update' construct must have at least one 
'self', 'host' or 'device' clause}}
 #pragma acc update if_present
 
   // expected-error@+1{{value of type 'struct NotConvertible' is not 
contextually convertible to 'bool'}}
-#pragma acc update self(Var) if (NC) device_type(I)
+#pragma acc update self(Var) if (NC) device_type(radeon)
 
   // expected-error@+2{{OpenACC 'if' clause cannot appear more than once on a 
'update' directive}}
   // expected-note@+1{{previous clause is here}}


        
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to