merge in mnc-dr-release history after reset to mnc-dr-dev
diff --git a/slang_rs_export_foreach.cpp b/slang_rs_export_foreach.cpp
index d622c01..d539e13 100644
--- a/slang_rs_export_foreach.cpp
+++ b/slang_rs_export_foreach.cpp
@@ -37,8 +37,8 @@
 const size_t RS_KERNEL_INPUT_LIMIT = 8; // see frameworks/base/libs/rs/cpu_ref/rsCpuCoreRuntime.h
 
 enum SpecialParameterKind {
-  SPK_INT,  // 'int' or 'unsigned int'
-  SPK_CTXT, // rs_kernel_context
+  SPK_LOCATION, // 'int' or 'unsigned int'
+  SPK_CONTEXT,  // rs_kernel_context
 };
 
 struct SpecialParameter {
@@ -50,20 +50,23 @@
 
 // Table entries are in the order parameters must occur in a kernel parameter list.
 const SpecialParameter specialParameterTable[] = {
-  { "ctxt", bcinfo::MD_SIG_Ctxt, SPK_CTXT, SLANG_M_TARGET_API },
-  { "x", bcinfo::MD_SIG_X, SPK_INT, SLANG_MINIMUM_TARGET_API },
-  { "y", bcinfo::MD_SIG_Y, SPK_INT, SLANG_MINIMUM_TARGET_API },
-  { "z", bcinfo::MD_SIG_Z, SPK_INT, SLANG_M_TARGET_API },
-  { nullptr, bcinfo::MD_SIG_None, SPK_INT, SLANG_MINIMUM_TARGET_API }, // marks end of table
+  { "context", bcinfo::MD_SIG_Ctxt, SPK_CONTEXT, SLANG_M_TARGET_API },
+  { "x", bcinfo::MD_SIG_X, SPK_LOCATION, SLANG_MINIMUM_TARGET_API },
+  { "y", bcinfo::MD_SIG_Y, SPK_LOCATION, SLANG_MINIMUM_TARGET_API },
+  { "z", bcinfo::MD_SIG_Z, SPK_LOCATION, SLANG_M_TARGET_API },
+  { nullptr, bcinfo::MD_SIG_None, SPK_LOCATION, SLANG_MINIMUM_TARGET_API }, // marks end of table
 };
 
 // If the specified name matches the name of an entry in
-// specialParameterTable, return the corresponding table index;
-// otherwise return -1.
+// specialParameterTable, return the corresponding table index.
+// Return -1 if not found.
 int lookupSpecialParameter(const llvm::StringRef name) {
-  for (int i = 0; specialParameterTable[i].name != nullptr; ++i)
-    if (name.equals(specialParameterTable[i].name))
+  for (int i = 0; specialParameterTable[i].name != nullptr; ++i) {
+    if (name.equals(specialParameterTable[i].name)) {
       return i;
+    }
+  }
+
   return -1;
 }
 
@@ -145,7 +148,7 @@
   // Validate remaining parameter types
 
   size_t IndexOfFirstSpecialParameter = numParams;
-  valid |= validateSpecialParameters(Context, FD, &IndexOfFirstSpecialParameter);
+  valid |= processSpecialParameters(Context, FD, &IndexOfFirstSpecialParameter);
 
   // Validate the non-special parameters, which should all be found before the
   // first special parameter.
@@ -156,7 +159,7 @@
     if (!QT->isPointerType()) {
       Context->ReportError(PVD->getLocation(),
                            "Compute kernel %0() cannot have non-pointer "
-                           "parameters besides (%1). Parameter '%2' is "
+                           "parameters besides special parameters (%1). Parameter '%2' is "
                            "of type: '%3'")
           << FD->getName() << listSpecialParameters(Context->getTargetAPI())
           << PVD->getName() << PVD->getType().getAsString();
@@ -233,7 +236,7 @@
   // Validate remaining parameter types
 
   size_t IndexOfFirstSpecialParameter = numParams;
-  valid |= validateSpecialParameters(Context, FD, &IndexOfFirstSpecialParameter);
+  valid |= processSpecialParameters(Context, FD, &IndexOfFirstSpecialParameter);
 
   // Validate the non-special parameters, which should all be found before the
   // first special.
@@ -286,10 +289,12 @@
   return valid;
 }
 
-// Search for the optional special parameters.  Returns true if valid.   Also
-// sets *IndexOfFirstSpecialParameter to the index of the first special parameter, or
-// FD->getNumParams() if none are found.
-bool RSExportForEach::validateSpecialParameters(
+// Process the optional special parameters:
+// - Sets *IndexOfFirstSpecialParameter to the index of the first special parameter, or
+//     FD->getNumParams() if none are found.
+// - Sets mSpecialParameterSignatureMetadata for the found special parameters.
+// Returns true if no errors.
+bool RSExportForEach::processSpecialParameters(
     RSContext *Context, const clang::FunctionDecl *FD,
     size_t *IndexOfFirstSpecialParameter) {
   slangAssert(IndexOfFirstSpecialParameter != nullptr);
@@ -298,104 +303,119 @@
 
   // Find all special parameters if present.
   int LastSpecialParameterIdx = -1;     // index into specialParameterTable
-  int FirstIntSpecialParameterIdx = -1; // index into specialParameterTable
-  clang::QualType FirstIntSpecialParameterType;
+  int FirstLocationSpecialParameterIdx = -1; // index into specialParameterTable
+  clang::QualType FirstLocationSpecialParameterType;
   size_t NumParams = FD->getNumParams();
   *IndexOfFirstSpecialParameter = NumParams;
   bool valid = true;
   for (size_t i = 0; i < NumParams; i++) {
     const clang::ParmVarDecl *PVD = FD->getParamDecl(i);
-    llvm::StringRef ParamName = PVD->getName();
+    const llvm::StringRef ParamName = PVD->getName();
+    const clang::QualType Type = PVD->getType();
+    const clang::QualType QT = Type.getCanonicalType();
+    const clang::QualType UT = QT.getUnqualifiedType();
     int SpecialParameterIdx = lookupSpecialParameter(ParamName);
-    if (SpecialParameterIdx >= 0) {
-      const SpecialParameter &SP = specialParameterTable[SpecialParameterIdx];
-      // We won't be invoked if two parameters of the same name are present.
-      slangAssert(!(mSpecialParameterSignatureMetadata & SP.bitval));
 
-      if (Context->getTargetAPI() < SP.minAPI) {
-        Context->ReportError(PVD->getLocation(),
-                             "Compute kernel %0() targeting SDK levels "
-                             "%1-%2 may not use parameter '%3'.")
-            << FD->getName()
-            << SLANG_MINIMUM_TARGET_API
-            << (SP.minAPI - 1)
-            << SP.name;
-        valid = false;
-      }
+    static const char KernelContextUnqualifiedTypeName[] =
+        "const struct rs_kernel_context_t *";
+    static const char KernelContextTypeName[] = "rs_kernel_context";
 
-      mSpecialParameterSignatureMetadata |= SP.bitval;
-      if (SpecialParameterIdx < LastSpecialParameterIdx) {
-        Context->ReportError(PVD->getLocation(),
-                             "In compute kernel %0(), parameter '%1' must "
-                             "be defined before parameter '%2'.")
-            << FD->getName()
-            << SP.name
-            << specialParameterTable[LastSpecialParameterIdx].name;
-        valid = false;
-      }
-      LastSpecialParameterIdx = SpecialParameterIdx;
+    // If the type is rs_context, it should have been named "context" and classified
+    // as a special parameter.
+    if (SpecialParameterIdx < 0 && UT.getAsString() == KernelContextUnqualifiedTypeName) {
+      Context->ReportError(
+          PVD->getLocation(),
+          "The special parameter of type '%0' must be called "
+          "'context' instead of '%1'.")
+          << KernelContextTypeName << ParamName;
+      SpecialParameterIdx = lookupSpecialParameter("context");
+    }
 
-      // Ensure that all SPK_INT special parameters have the same type.
-      if (SP.kind == SPK_INT) {
-        clang::QualType SpecialParameterType = PVD->getType();
-        if (FirstIntSpecialParameterIdx >= 0) {
-          if (SpecialParameterType != FirstIntSpecialParameterType) {
-            Context->ReportError(PVD->getLocation(),
-                                 "Parameters '%0' and '%1' must be of the same type. "
-                                 "'%0' is of type '%2' while '%1' is of type '%3'.")
-                << specialParameterTable[FirstIntSpecialParameterIdx].name
-                << SP.name
-                << FirstIntSpecialParameterType.getAsString()
-                << SpecialParameterType.getAsString();
-            valid = false;
-          }
-        } else {
-          FirstIntSpecialParameterIdx = SpecialParameterIdx;
-          FirstIntSpecialParameterType = SpecialParameterType;
-        }
-      }
-    } else {
-      // It's not a special parameter.
+    // If it's not a special parameter, check that it appears before any special
+    // parameter.
+    if (SpecialParameterIdx < 0) {
       if (*IndexOfFirstSpecialParameter < NumParams) {
         Context->ReportError(PVD->getLocation(),
                              "In compute kernel %0(), parameter '%1' cannot "
-                             "appear after any of the (%2) parameters.")
+                             "appear after any of the special parameters (%2).")
             << FD->getName() << ParamName << listSpecialParameters(Context->getTargetAPI());
         valid = false;
       }
       continue;
     }
-    // Validate the data type of the special parameter.
-    switch (specialParameterTable[SpecialParameterIdx].kind) {
-      case SPK_INT: {
-        clang::QualType QT = PVD->getType().getCanonicalType();
-        clang::QualType UT = QT.getUnqualifiedType();
-        if (UT != C.UnsignedIntTy && UT != C.IntTy) {
-          Context->ReportError(PVD->getLocation(),
-                               "Parameter '%0' must be of type 'int' or "
-                               "'unsigned int'. It is of type '%1'.")
-              << ParamName << PVD->getType().getAsString();
-          valid = false;
-        }
-        break;
-      }
-      case SPK_CTXT: {
-        static const char ExpectedTypeNameMatch[] = "const struct rs_kernel_context_t *";
-        static const char ExpectedTypeNamePrint[] = "rs_kernel_context";
-        clang::QualType QT = PVD->getType().getCanonicalType();
-        clang::QualType UT = QT.getUnqualifiedType();
-        if (UT.getAsString() != ExpectedTypeNameMatch) {
-          Context->ReportError(PVD->getLocation(),
-                               "Parameter '%0' must be of type '%1'. "
-                               "It is of type '%2'.")
-              << ParamName << ExpectedTypeNamePrint << PVD->getType().getAsString();
-          valid = false;
-        }
-        break;
-      }
-      default:
-        slangAssert(!"Unexpected special parameter type");
+
+    const SpecialParameter &SP = specialParameterTable[SpecialParameterIdx];
+
+    // Verify that this special parameter is OK for the current API level.
+    if (Context->getTargetAPI() < SP.minAPI) {
+      Context->ReportError(PVD->getLocation(),
+                           "Compute kernel %0() targeting SDK levels "
+                           "%1-%2 may not use special parameter '%3'.")
+          << FD->getName() << SLANG_MINIMUM_TARGET_API << (SP.minAPI - 1)
+          << SP.name;
+      valid = false;
     }
+
+    // Check that the order of the special parameters is correct.
+    if (SpecialParameterIdx < LastSpecialParameterIdx) {
+      Context->ReportError(
+          PVD->getLocation(),
+          "In compute kernel %0(), special parameter '%1' must "
+          "be defined before special parameter '%2'.")
+          << FD->getName() << SP.name
+          << specialParameterTable[LastSpecialParameterIdx].name;
+      valid = false;
+    }
+
+    // Validate the data type of the special parameter.
+    switch (SP.kind) {
+    case SPK_LOCATION: {
+      // Location special parameters can only be int or uint.
+      if (UT != C.UnsignedIntTy && UT != C.IntTy) {
+        Context->ReportError(PVD->getLocation(),
+                             "Special parameter '%0' must be of type 'int' or "
+                             "'unsigned int'. It is of type '%1'.")
+            << ParamName << Type.getAsString();
+        valid = false;
+      }
+
+      // Ensure that all location special parameters have the same type.
+      if (FirstLocationSpecialParameterIdx >= 0) {
+        if (Type != FirstLocationSpecialParameterType) {
+          Context->ReportError(
+              PVD->getLocation(),
+              "Special parameters '%0' and '%1' must be of the same type. "
+              "'%0' is of type '%2' while '%1' is of type '%3'.")
+              << specialParameterTable[FirstLocationSpecialParameterIdx].name
+              << SP.name << FirstLocationSpecialParameterType.getAsString()
+              << Type.getAsString();
+          valid = false;
+        }
+      } else {
+        FirstLocationSpecialParameterIdx = SpecialParameterIdx;
+        FirstLocationSpecialParameterType = Type;
+      }
+    } break;
+    case SPK_CONTEXT: {
+      // Check that variables named "context" are of type rs_context.
+      if (UT.getAsString() != KernelContextUnqualifiedTypeName) {
+        Context->ReportError(PVD->getLocation(),
+                             "Special parameter '%0' must be of type '%1'. "
+                             "It is of type '%2'.")
+            << ParamName << KernelContextTypeName
+            << Type.getAsString();
+        valid = false;
+      }
+    } break;
+    default:
+      slangAssert(!"Unexpected special parameter type");
+    }
+
+    // We should not be invoked if two parameters of the same name are present.
+    slangAssert(!(mSpecialParameterSignatureMetadata & SP.bitval));
+    mSpecialParameterSignatureMetadata |= SP.bitval;
+
+    LastSpecialParameterIdx = SpecialParameterIdx;
     // If this is the first time we find a special parameter, save it.
     if (*IndexOfFirstSpecialParameter >= NumParams) {
       *IndexOfFirstSpecialParameter = i;
diff --git a/slang_rs_export_foreach.h b/slang_rs_export_foreach.h
index 54b1303..581d8a1 100644
--- a/slang_rs_export_foreach.h
+++ b/slang_rs_export_foreach.h
@@ -86,9 +86,9 @@
   bool validateAndConstructKernelParams(RSContext *Context,
                                         const clang::FunctionDecl *FD);
 
-  bool validateSpecialParameters(RSContext *Context,
-                                 const clang::FunctionDecl *FD,
-                                 size_t *IndexOfFirstSpecialParameter);
+  bool processSpecialParameters(RSContext *Context,
+                                const clang::FunctionDecl *FD,
+                                size_t *IndexOfFirstSpecialParameter);
 
   bool setSignatureMetadata(RSContext *Context,
                             const clang::FunctionDecl *FD);
diff --git a/tests/F_ctxt_wrong_api/F_ctxt_wrong_api.rs b/tests/F_ctxt_wrong_api/F_ctxt_wrong_api.rs
index 34a0a7c..cabf40e 100644
--- a/tests/F_ctxt_wrong_api/F_ctxt_wrong_api.rs
+++ b/tests/F_ctxt_wrong_api/F_ctxt_wrong_api.rs
@@ -2,6 +2,6 @@
 #pragma version(1)
 #pragma rs java_package_name(foo)
 
-int RS_KERNEL good(int in, rs_kernel_context ctxt) {
+int RS_KERNEL good(int in, rs_kernel_context context) {
   return 0;
 }
diff --git a/tests/F_ctxt_wrong_name/context.rs b/tests/F_ctxt_wrong_name/context.rs
new file mode 100644
index 0000000..d39fbed
--- /dev/null
+++ b/tests/F_ctxt_wrong_name/context.rs
@@ -0,0 +1,7 @@
+// -target-api 23
+#pragma version(1)
+#pragma rs java_package_name(foo)
+
+int RS_KERNEL bad(int in, uint32_t x, rs_kernel_context ct) {
+  return 0;
+}
diff --git a/tests/F_ctxt_wrong_name/stderr.txt.expect b/tests/F_ctxt_wrong_name/stderr.txt.expect
new file mode 100644
index 0000000..b102ee6
--- /dev/null
+++ b/tests/F_ctxt_wrong_name/stderr.txt.expect
@@ -0,0 +1,2 @@
+context.rs:5:57: error: The special parameter of type 'rs_kernel_context' must be called 'context' instead of 'ct'.
+context.rs:5:57: error: In compute kernel bad(), special parameter 'context' must be defined before special parameter 'x'.
diff --git a/tests/F_ctxt_wrong_name/stdout.txt.expect b/tests/F_ctxt_wrong_name/stdout.txt.expect
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tests/F_ctxt_wrong_name/stdout.txt.expect
diff --git a/tests/F_ctxt_wrong_place/F_ctxt_wrong_place.rs b/tests/F_ctxt_wrong_place/F_ctxt_wrong_place.rs
index 7226094..29298ff 100644
--- a/tests/F_ctxt_wrong_place/F_ctxt_wrong_place.rs
+++ b/tests/F_ctxt_wrong_place/F_ctxt_wrong_place.rs
@@ -2,10 +2,10 @@
 #pragma version(1)
 #pragma rs java_package_name(foo)
 
-int RS_KERNEL good(int in, rs_kernel_context ctxt, uint32_t x) {
+int RS_KERNEL good(int in, rs_kernel_context context, uint32_t x) {
   return 0;
 }
 
-int RS_KERNEL bad(int in, uint32_t x, rs_kernel_context ctxt) {
+int RS_KERNEL bad(int in, uint32_t x, rs_kernel_context context) {
   return 0;
 }
diff --git a/tests/F_ctxt_wrong_place/stderr.txt.expect b/tests/F_ctxt_wrong_place/stderr.txt.expect
index 60c2b70..70b3f6e 100644
--- a/tests/F_ctxt_wrong_place/stderr.txt.expect
+++ b/tests/F_ctxt_wrong_place/stderr.txt.expect
@@ -1 +1 @@
-F_ctxt_wrong_place.rs:9:57: error: In compute kernel bad(), parameter 'ctxt' must be defined before parameter 'x'.
+F_ctxt_wrong_place.rs:9:57: error: In compute kernel bad(), special parameter 'context' must be defined before special parameter 'x'.
diff --git a/tests/F_ctxt_wrong_type/F_ctxt_wrong_type.rs b/tests/F_ctxt_wrong_type/F_ctxt_wrong_type.rs
index 358dae4..11d2433 100644
--- a/tests/F_ctxt_wrong_type/F_ctxt_wrong_type.rs
+++ b/tests/F_ctxt_wrong_type/F_ctxt_wrong_type.rs
@@ -2,14 +2,14 @@
 #pragma version(1)
 #pragma rs java_package_name(foo)
 
-int RS_KERNEL good1(int in, rs_kernel_context ctxt) {
+int RS_KERNEL good1(int in, rs_kernel_context context) {
   return 0;
 }
 
-int RS_KERNEL good2(int in, const rs_kernel_context ctxt) {
+int RS_KERNEL good2(int in, const rs_kernel_context context) {
   return 0;
 }
 
-int RS_KERNEL bad3(int in, const rs_kernel_context *ctxt) {
+int RS_KERNEL bad3(int in, const rs_kernel_context *context) {
   return 0;
 }
diff --git a/tests/F_ctxt_wrong_type/stderr.txt.expect b/tests/F_ctxt_wrong_type/stderr.txt.expect
index 54cf641..d6de8fa 100644
--- a/tests/F_ctxt_wrong_type/stderr.txt.expect
+++ b/tests/F_ctxt_wrong_type/stderr.txt.expect
@@ -1 +1 @@
-F_ctxt_wrong_type.rs:13:53: error: Parameter 'ctxt' must be of type 'rs_kernel_context'. It is of type 'const rs_kernel_context *'.
+F_ctxt_wrong_type.rs:13:53: error: Special parameter 'context' must be of type 'rs_kernel_context'. It is of type 'const rs_kernel_context *'.
diff --git a/tests/F_root_compute_int_in/stderr.txt.expect b/tests/F_root_compute_int_in/stderr.txt.expect
index cf6eabe..13925df 100644
--- a/tests/F_root_compute_int_in/stderr.txt.expect
+++ b/tests/F_root_compute_int_in/stderr.txt.expect
@@ -1,2 +1,2 @@
-root_compute_int_in.rs:4:21: error: Compute kernel root() cannot have non-pointer parameters besides ('ctxt', 'x', 'y', 'z'). Parameter 'in' is of type: 'const int'
+root_compute_int_in.rs:4:21: error: Compute kernel root() cannot have non-pointer parameters besides special parameters ('context', 'x', 'y', 'z'). Parameter 'in' is of type: 'const int'
 root_compute_int_in.rs:4:6: error: Compute kernel root() must have at least one parameter for in or out
diff --git a/tests/F_root_compute_non_ptr_usrData/stderr.txt.expect b/tests/F_root_compute_non_ptr_usrData/stderr.txt.expect
index 04c7735..a113ce4 100644
--- a/tests/F_root_compute_non_ptr_usrData/stderr.txt.expect
+++ b/tests/F_root_compute_non_ptr_usrData/stderr.txt.expect
@@ -1 +1 @@
-root_compute_non_ptr_usrData.rs:4:48: error: Compute kernel root() cannot have non-pointer parameters besides ('ctxt', 'x', 'y', 'z'). Parameter 'usrData' is of type: 'const int'
+root_compute_non_ptr_usrData.rs:4:48: error: Compute kernel root() cannot have non-pointer parameters besides special parameters ('context', 'x', 'y', 'z'). Parameter 'usrData' is of type: 'const int'
diff --git a/tests/F_root_compute_non_uint32_t_xyzar/stderr.txt.expect b/tests/F_root_compute_non_uint32_t_xyzar/stderr.txt.expect
index ba7eecb..9b4af29 100644
--- a/tests/F_root_compute_non_uint32_t_xyzar/stderr.txt.expect
+++ b/tests/F_root_compute_non_uint32_t_xyzar/stderr.txt.expect
@@ -1,6 +1,6 @@
-root_compute_non_uint32_t_xyzar.rs:5:17: error: Parameter 'x' must be of type 'int' or 'unsigned int'. It is of type 'short'.
-root_compute_non_uint32_t_xyzar.rs:5:26: error: Parameters 'x' and 'y' must be of the same type. 'x' is of type 'short' while 'y' is of type 'float'.
-root_compute_non_uint32_t_xyzar.rs:5:26: error: Parameter 'y' must be of type 'int' or 'unsigned int'. It is of type 'float'.
-root_compute_non_uint32_t_xyzar.rs:5:36: error: Parameters 'x' and 'z' must be of the same type. 'x' is of type 'short' while 'z' is of type 'double'.
-root_compute_non_uint32_t_xyzar.rs:5:36: error: Parameter 'z' must be of type 'int' or 'unsigned int'. It is of type 'double'.
-root_compute_non_uint32_t_xyzar.rs:5:45: error: In compute kernel root(), parameter 'ar' cannot appear after any of the ('ctxt', 'x', 'y', 'z') parameters.
+root_compute_non_uint32_t_xyzar.rs:5:17: error: Special parameter 'x' must be of type 'int' or 'unsigned int'. It is of type 'short'.
+root_compute_non_uint32_t_xyzar.rs:5:26: error: Special parameter 'y' must be of type 'int' or 'unsigned int'. It is of type 'float'.
+root_compute_non_uint32_t_xyzar.rs:5:26: error: Special parameters 'x' and 'y' must be of the same type. 'x' is of type 'short' while 'y' is of type 'float'.
+root_compute_non_uint32_t_xyzar.rs:5:36: error: Special parameter 'z' must be of type 'int' or 'unsigned int'. It is of type 'double'.
+root_compute_non_uint32_t_xyzar.rs:5:36: error: Special parameters 'x' and 'z' must be of the same type. 'x' is of type 'short' while 'z' is of type 'double'.
+root_compute_non_uint32_t_xyzar.rs:5:45: error: In compute kernel root(), parameter 'ar' cannot appear after any of the special parameters ('context', 'x', 'y', 'z').
diff --git a/tests/F_root_compute_non_uint32_t_xyzwar/stderr.txt.expect b/tests/F_root_compute_non_uint32_t_xyzwar/stderr.txt.expect
index bdd564b..9678fac 100644
--- a/tests/F_root_compute_non_uint32_t_xyzwar/stderr.txt.expect
+++ b/tests/F_root_compute_non_uint32_t_xyzwar/stderr.txt.expect
@@ -1,7 +1,7 @@
-root_compute_non_uint32_t_xyzwar.rs:6:17: error: Parameter 'x' must be of type 'int' or 'unsigned int'. It is of type 'short'.
-root_compute_non_uint32_t_xyzwar.rs:6:26: error: Parameters 'x' and 'y' must be of the same type. 'x' is of type 'short' while 'y' is of type 'float'.
-root_compute_non_uint32_t_xyzwar.rs:6:26: error: Parameter 'y' must be of type 'int' or 'unsigned int'. It is of type 'float'.
-root_compute_non_uint32_t_xyzwar.rs:6:36: error: Parameters 'x' and 'z' must be of the same type. 'x' is of type 'short' while 'z' is of type 'double'.
-root_compute_non_uint32_t_xyzwar.rs:6:36: error: Parameter 'z' must be of type 'int' or 'unsigned int'. It is of type 'double'.
-root_compute_non_uint32_t_xyzwar.rs:6:44: error: In compute kernel root(), parameter 'w' cannot appear after any of the ('ctxt', 'x', 'y', 'z') parameters.
-root_compute_non_uint32_t_xyzwar.rs:6:53: error: In compute kernel root(), parameter 'ar' cannot appear after any of the ('ctxt', 'x', 'y', 'z') parameters.
+root_compute_non_uint32_t_xyzwar.rs:6:17: error: Special parameter 'x' must be of type 'int' or 'unsigned int'. It is of type 'short'.
+root_compute_non_uint32_t_xyzwar.rs:6:26: error: Special parameter 'y' must be of type 'int' or 'unsigned int'. It is of type 'float'.
+root_compute_non_uint32_t_xyzwar.rs:6:26: error: Special parameters 'x' and 'y' must be of the same type. 'x' is of type 'short' while 'y' is of type 'float'.
+root_compute_non_uint32_t_xyzwar.rs:6:36: error: Special parameter 'z' must be of type 'int' or 'unsigned int'. It is of type 'double'.
+root_compute_non_uint32_t_xyzwar.rs:6:36: error: Special parameters 'x' and 'z' must be of the same type. 'x' is of type 'short' while 'z' is of type 'double'.
+root_compute_non_uint32_t_xyzwar.rs:6:44: error: In compute kernel root(), parameter 'w' cannot appear after any of the special parameters ('context', 'x', 'y', 'z').
+root_compute_non_uint32_t_xyzwar.rs:6:53: error: In compute kernel root(), parameter 'ar' cannot appear after any of the special parameters ('context', 'x', 'y', 'z').
diff --git a/tests/F_root_compute_really_bad/stderr.txt.expect b/tests/F_root_compute_really_bad/stderr.txt.expect
index d737ef0..7d10dcc 100644
--- a/tests/F_root_compute_really_bad/stderr.txt.expect
+++ b/tests/F_root_compute_really_bad/stderr.txt.expect
@@ -1,17 +1,17 @@
 root_compute_really_bad.rs:4:5: error: Compute kernel root() is required to return a void type
-root_compute_really_bad.rs:5:31: error: In compute kernel root(), parameter 'x' must be defined before parameter 'y'.
-root_compute_really_bad.rs:6:19: error: In compute kernel root(), parameter 'extra1' cannot appear after any of the ('ctxt', 'x', 'y', 'z') parameters.
-root_compute_really_bad.rs:6:36: error: In compute kernel root(), parameter 'extra2' cannot appear after any of the ('ctxt', 'x', 'y', 'z') parameters.
-root_compute_really_bad.rs:4:14: error: Compute kernel root() cannot have non-pointer parameters besides ('ctxt', 'x', 'y', 'z'). Parameter 'ain' is of type: 'int'
-root_compute_really_bad.rs:4:23: error: Compute kernel root() cannot have non-pointer parameters besides ('ctxt', 'x', 'y', 'z'). Parameter 'aout' is of type: 'int'
-root_compute_really_bad.rs:4:33: error: Compute kernel root() cannot have non-pointer parameters besides ('ctxt', 'x', 'y', 'z'). Parameter 'usrData' is of type: 'int'
-root_compute_really_bad.rs:4:48: error: Compute kernel root() cannot have non-pointer parameters besides ('ctxt', 'x', 'y', 'z'). Parameter 'x1' is of type: 'float'
-root_compute_really_bad.rs:4:59: error: Compute kernel root() cannot have non-pointer parameters besides ('ctxt', 'x', 'y', 'z'). Parameter 'y1' is of type: 'double'
+root_compute_really_bad.rs:5:31: error: In compute kernel root(), special parameter 'x' must be defined before special parameter 'y'.
+root_compute_really_bad.rs:6:19: error: In compute kernel root(), parameter 'extra1' cannot appear after any of the special parameters ('context', 'x', 'y', 'z').
+root_compute_really_bad.rs:6:36: error: In compute kernel root(), parameter 'extra2' cannot appear after any of the special parameters ('context', 'x', 'y', 'z').
+root_compute_really_bad.rs:4:14: error: Compute kernel root() cannot have non-pointer parameters besides special parameters ('context', 'x', 'y', 'z'). Parameter 'ain' is of type: 'int'
+root_compute_really_bad.rs:4:23: error: Compute kernel root() cannot have non-pointer parameters besides special parameters ('context', 'x', 'y', 'z'). Parameter 'aout' is of type: 'int'
+root_compute_really_bad.rs:4:33: error: Compute kernel root() cannot have non-pointer parameters besides special parameters ('context', 'x', 'y', 'z'). Parameter 'usrData' is of type: 'int'
+root_compute_really_bad.rs:4:48: error: Compute kernel root() cannot have non-pointer parameters besides special parameters ('context', 'x', 'y', 'z'). Parameter 'x1' is of type: 'float'
+root_compute_really_bad.rs:4:59: error: Compute kernel root() cannot have non-pointer parameters besides special parameters ('context', 'x', 'y', 'z'). Parameter 'y1' is of type: 'double'
 root_compute_really_bad.rs:4:5: error: Compute kernel root() must have at least one parameter for in or out
 root_compute_really_bad.rs:10:44: error: Compute kernel root2() can only have one non-const pointer parameter. Parameters 'ain' and 'usrData' are both non-const.
 root_compute_really_bad.rs:10:66: error: Unexpected parameter 'x1' for compute kernel root2()
 root_compute_really_bad.rs:11:26: error: Unexpected parameter 'y1' for compute kernel root2()
-root_compute_really_bad.rs:16:38: error: In compute kernel root_kernel(), parameter 'x' must be defined before parameter 'y'.
-root_compute_really_bad.rs:16:50: error: In compute kernel root_kernel(), parameter 'extra1' cannot appear after any of the ('ctxt', 'x', 'y', 'z') parameters.
-root_compute_really_bad.rs:16:67: error: In compute kernel root_kernel(), parameter 'extra2' cannot appear after any of the ('ctxt', 'x', 'y', 'z') parameters.
+root_compute_really_bad.rs:16:38: error: In compute kernel root_kernel(), special parameter 'x' must be defined before special parameter 'y'.
+root_compute_really_bad.rs:16:50: error: In compute kernel root_kernel(), parameter 'extra1' cannot appear after any of the special parameters ('context', 'x', 'y', 'z').
+root_compute_really_bad.rs:16:67: error: In compute kernel root_kernel(), parameter 'extra2' cannot appear after any of the special parameters ('context', 'x', 'y', 'z').
 root_compute_really_bad.rs:15:31: error: Compute kernel root_kernel() cannot have parameter 'aout' of pointer type: 'int *'
diff --git a/tests/F_root_compute_too_many_args/stderr.txt.expect b/tests/F_root_compute_too_many_args/stderr.txt.expect
index dbb0500..8afe8bc 100644
--- a/tests/F_root_compute_too_many_args/stderr.txt.expect
+++ b/tests/F_root_compute_too_many_args/stderr.txt.expect
@@ -1,2 +1,2 @@
-root_compute_too_many_args.rs:6:20: error: In compute kernel root(), parameter 'extra1' cannot appear after any of the ('ctxt', 'x', 'y', 'z') parameters.
-root_compute_too_many_args.rs:6:37: error: In compute kernel root(), parameter 'extra2' cannot appear after any of the ('ctxt', 'x', 'y', 'z') parameters.
+root_compute_too_many_args.rs:6:20: error: In compute kernel root(), parameter 'extra1' cannot appear after any of the special parameters ('context', 'x', 'y', 'z').
+root_compute_too_many_args.rs:6:37: error: In compute kernel root(), parameter 'extra2' cannot appear after any of the special parameters ('context', 'x', 'y', 'z').
diff --git a/tests/F_z_wrong_api/stderr.txt.expect b/tests/F_z_wrong_api/stderr.txt.expect
index 9553acd..0a64501 100644
--- a/tests/F_z_wrong_api/stderr.txt.expect
+++ b/tests/F_z_wrong_api/stderr.txt.expect
@@ -1 +1 @@
-F_z_wrong_api.rs:5:60: error: Compute kernel bad() targeting SDK levels 11-22 may not use parameter 'z'.
+F_z_wrong_api.rs:5:60: error: Compute kernel bad() targeting SDK levels 11-22 may not use special parameter 'z'.
diff --git a/tests/P_all_api_23/all23.rs b/tests/P_all_api_23/all23.rs
index 08711bd..7d2acc9 100644
--- a/tests/P_all_api_23/all23.rs
+++ b/tests/P_all_api_23/all23.rs
@@ -4702,7 +4702,7 @@
 char buf4679[200];
 char buf4680[200];
 
-void RS_KERNEL test(int in, rs_kernel_context ctxt) {
+void RS_KERNEL test(int in, rs_kernel_context context) {
     *(uchar*)buf0 = abs(*(char*)buf1);
     *(uchar2*)buf2 = abs(*(char2*)buf3);
     *(uchar3*)buf4 = abs(*(char3*)buf5);
@@ -5901,19 +5901,19 @@
     rsForEach(*(rs_script*)buf3173, *(rs_allocation*)buf3174, *(rs_allocation*)buf3175);
     *(float*)buf3176 = rsFrac(*(float*)buf3177);
     *(rs_allocation*)buf3178 = rsGetAllocation((const void*) buf3179);
-    *(uint32_t*)buf3180 = rsGetArray0(ctxt);
-    *(uint32_t*)buf3181 = rsGetArray1(ctxt);
-    *(uint32_t*)buf3182 = rsGetArray2(ctxt);
-    *(uint32_t*)buf3183 = rsGetArray3(ctxt);
-    *(uint32_t*)buf3184 = rsGetDimArray0(ctxt);
-    *(uint32_t*)buf3185 = rsGetDimArray1(ctxt);
-    *(uint32_t*)buf3186 = rsGetDimArray2(ctxt);
-    *(uint32_t*)buf3187 = rsGetDimArray3(ctxt);
-    *(bool*)buf3188 = rsGetDimHasFaces(ctxt);
-    *(uint32_t*)buf3189 = rsGetDimLod(ctxt);
-    *(uint32_t*)buf3190 = rsGetDimX(ctxt);
-    *(uint32_t*)buf3191 = rsGetDimY(ctxt);
-    *(uint32_t*)buf3192 = rsGetDimZ(ctxt);
+    *(uint32_t*)buf3180 = rsGetArray0(context);
+    *(uint32_t*)buf3181 = rsGetArray1(context);
+    *(uint32_t*)buf3182 = rsGetArray2(context);
+    *(uint32_t*)buf3183 = rsGetArray3(context);
+    *(uint32_t*)buf3184 = rsGetDimArray0(context);
+    *(uint32_t*)buf3185 = rsGetDimArray1(context);
+    *(uint32_t*)buf3186 = rsGetDimArray2(context);
+    *(uint32_t*)buf3187 = rsGetDimArray3(context);
+    *(bool*)buf3188 = rsGetDimHasFaces(context);
+    *(uint32_t*)buf3189 = rsGetDimLod(context);
+    *(uint32_t*)buf3190 = rsGetDimX(context);
+    *(uint32_t*)buf3191 = rsGetDimY(context);
+    *(uint32_t*)buf3192 = rsGetDimZ(context);
     *(float*)buf3193 = rsGetDt();
     *(const void**)buf3194 = rsGetElementAt(*(rs_allocation*)buf3195, *(uint32_t*)buf3196);
     *(const void**)buf3197 = rsGetElementAt(*(rs_allocation*)buf3198, *(uint32_t*)buf3199, *(uint32_t*)buf3200);
@@ -6053,8 +6053,8 @@
     *(uchar*)buf3734 = rsGetElementAtYuv_uchar_U(*(rs_allocation*)buf3735, *(uint32_t*)buf3736, *(uint32_t*)buf3737);
     *(uchar*)buf3738 = rsGetElementAtYuv_uchar_V(*(rs_allocation*)buf3739, *(uint32_t*)buf3740, *(uint32_t*)buf3741);
     *(uchar*)buf3742 = rsGetElementAtYuv_uchar_Y(*(rs_allocation*)buf3743, *(uint32_t*)buf3744, *(uint32_t*)buf3745);
-    *(rs_allocation_cubemap_face*)buf3746 = rsGetFace(ctxt);
-    *(uint32_t*)buf3747 = rsGetLod(ctxt);
+    *(rs_allocation_cubemap_face*)buf3746 = rsGetFace(context);
+    *(uint32_t*)buf3747 = rsGetLod(context);
     *(bool*)buf3748 = rsIsObject(*(rs_element*)buf3749);
     *(bool*)buf3750 = rsIsObject(*(rs_type*)buf3751);
     *(bool*)buf3752 = rsIsObject(*(rs_allocation*)buf3753);