瀏覽代碼

Add 'center' keyword; allow 'sample', 'precise', 'center' and 'globallycoherent' as identifiers (#1406)

* Add 'center' keyword as an interpolation modifier

FXC allows the interpolation modifier 'center' (equivalent to 'linear') and DXC should too. At places where interpolation modifier is not expected 'center' can still be used as an identifier. This change makes it easier to switch from FXC to DXC. Add warnings when center is used with centroid or sample. Update varmod-syntax.hlsl test to include 'center'.

* Allow 'sample', 'precise' and 'globallycoherent' as identifiers

In DXC 'sample', 'precise' and 'globallycoherent' were treated as a keywords and could not be used as identifiers. FXC allowed this.
This change makes it easier to switch from FXC to DXC.

* Update fxc errors in varmods-syntax.hlsl based on fxc version 10.0.17713.
Helena Kotas 7 年之前
父節點
當前提交
36183ed715

+ 6 - 0
tools/clang/include/clang/Basic/Attr.td

@@ -754,6 +754,12 @@ def HLSLLinear : InheritableAttr {
   let Documentation = [Undocumented];
 }
 
+def HLSLCenter : InheritableAttr {
+  let Spellings = [CXX11<"", "center", 2015>];
+  let Subjects = SubjectList<[Function, ParmVar, Field]>;
+  let Documentation = [Undocumented];
+}
+
 def HLSLNoPerspective : InheritableAttr {
   let Spellings = [CXX11<"", "noperspective", 2015>];
   let Subjects = SubjectList<[Function, ParmVar, Field]>;

+ 1 - 0
tools/clang/include/clang/Basic/TokenKinds.def

@@ -498,6 +498,7 @@ KEYWORD(out                         , KEYHLSL)
 KEYWORD(inout                       , KEYHLSL)
 KEYWORD(uniform                     , KEYHLSL)
 KEYWORD(precise                     , KEYHLSL)
+KEYWORD(center                      , KEYHLSL)
 KEYWORD(shared                      , KEYHLSL)
 KEYWORD(groupshared                 , KEYHLSL)
 KEYWORD(discard                     , KEYHLSL)

+ 18 - 4
tools/clang/lib/Parse/ParseDecl.cpp

@@ -721,6 +721,7 @@ void Parser::ParseGNUAttributeArgs(IdentifierInfo *AttrName,
     //case AttributeList::AT_HLSLIn:
     //case AttributeList::AT_HLSLInOut:
     //case AttributeList::AT_HLSLLinear:
+    //case AttributeList::AT_HLSLCenter:
     //case AttributeList::AT_HLSLNoInterpolation:
     //case AttributeList::AT_HLSLNoPerspective:
     //case AttributeList::AT_HLSLOut:
@@ -3715,10 +3716,8 @@ HLSLReservedKeyword:
       isStorageClass = true;
       break;
     // HLSL Change Starts
-    case tok::kw_precise:
     case tok::kw_shared:
     case tok::kw_groupshared:
-    case tok::kw_globallycoherent:
     case tok::kw_uniform:
     case tok::kw_in:
     case tok::kw_out:
@@ -3726,7 +3725,6 @@ HLSLReservedKeyword:
     case tok::kw_linear:
     case tok::kw_nointerpolation:
     case tok::kw_noperspective:
-    case tok::kw_sample:
     case tok::kw_centroid:
     case tok::kw_column_major:
     case tok::kw_row_major:
@@ -3747,7 +3745,22 @@ HLSLReservedKeyword:
         }
       }
       break;
-    // HLSL Change Ends
+    case tok::kw_precise:
+    case tok::kw_sample:
+    case tok::kw_globallycoherent:
+    case tok::kw_center:
+      // Back-compat: 'precise', 'globallycoherent', 'center' and 'sample' are keywords when used as an interpolation 
+      // modifiers, but in FXC they can also be used an identifiers. If the decl type has already been specified
+      // we need to update the token to be handled as an identifier.
+      if (getLangOpts().HLSL) {
+        if (DS.getTypeSpecType() != DeclSpec::TST_unspecified) {
+          Tok.setKind(tok::identifier);
+          continue;
+        }
+        DS.getAttributes().addNew(Tok.getIdentifierInfo(), Tok.getLocation(), 0, SourceLocation(), 0, 0, AttributeList::AS_CXX11);
+      }
+      break;
+      // HLSL Change Ends
     case tok::kw_auto:
       if (getLangOpts().HLSL) { goto HLSLReservedKeyword; } // HLSL Change - auto is reserved for HLSL
       if (getLangOpts().CPlusPlus11) {
@@ -5163,6 +5176,7 @@ bool Parser::isDeclarationSpecifier(bool DisambiguatingWithExpression) {
 
   // HLSL Change Starts
   case tok::kw_precise:
+  case tok::kw_center:
   case tok::kw_shared:
   case tok::kw_groupshared:
   case tok::kw_globallycoherent:

+ 12 - 1
tools/clang/lib/Parse/ParseExpr.cpp

@@ -788,7 +788,18 @@ HLSLReservedKeyword:
       return ExprError();
     assert(Tok.isNot(tok::kw_decltype) && Tok.isNot(tok::kw___super));
     return ParseCastExpression(isUnaryExpression, isAddressOfOperand);
-      
+
+    // HLSL Change Starts
+  case tok::kw_precise:
+  case tok::kw_sample:
+  case tok::kw_globallycoherent:
+  case tok::kw_center:
+    // Back-compat: 'precise', 'globallycoherent', 'center' and 'sample' are keywords when used as an interpolation 
+    // modifiers, but in FXC they can also be used an identifiers. No interpolation modifiers are expected here
+    // so we need to change the token type to tok::identifier and fall through to the next case.
+    Tok.setKind(tok::identifier);
+    __fallthrough;
+    // HLSL Change Ends
   case tok::identifier: {      // primary-expression: identifier
                                // unqualified-id: identifier
                                // constant: enumeration-constant

+ 1 - 0
tools/clang/lib/Parse/ParseTentative.cpp

@@ -1280,6 +1280,7 @@ Parser::isCXXDeclarationSpecifier(Parser::TPResult BracedCastResult,
   case tok::kw_noperspective:
   case tok::kw_sample:
   case tok::kw_precise:
+  case tok::kw_center:
   case tok::kw_shared:
   case tok::kw_groupshared:
   case tok::kw_globallycoherent:

+ 23 - 0
tools/clang/lib/Sema/SemaHLSL.cpp

@@ -10312,6 +10312,7 @@ void hlsl::HandleDeclAttributeForHLSL(Sema &S, Decl *D, const AttributeList &A,
       A.getAttributeSpellingListIndex());
     break;
   case AttributeList::AT_HLSLLinear:
+  case AttributeList::AT_HLSLCenter:
     declAttr = ::new (S.Context) HLSLLinearAttr(A.getRange(), S.Context,
       A.getAttributeSpellingListIndex());
     break;
@@ -11001,6 +11002,7 @@ bool Sema::DiagnoseHLSLDecl(Declarator &D, DeclContext *DC,
     *pNoPerspective = nullptr,
     *pSample = nullptr,
     *pCentroid = nullptr,
+    *pCenter = nullptr,
     *pAnyLinear = nullptr,                   // first linear attribute found
     *pTopology = nullptr;
   bool usageIn = false;
@@ -11092,6 +11094,7 @@ bool Sema::DiagnoseHLSLDecl(Declarator &D, DeclContext *DC,
       break;
 
     case AttributeList::AT_HLSLLinear:
+    case AttributeList::AT_HLSLCenter:
     case AttributeList::AT_HLSLNoPerspective:
     case AttributeList::AT_HLSLSample:
     case AttributeList::AT_HLSLCentroid:
@@ -11112,6 +11115,13 @@ bool Sema::DiagnoseHLSLDecl(Declarator &D, DeclContext *DC,
         }
         pLinear = pAttr;
         break;
+      case AttributeList::AT_HLSLCenter:
+        if (pCenter) {
+          Diag(pAttr->getLoc(), diag::warn_hlsl_duplicate_specifier)
+            << pAttr->getName() << pAttr->getRange();
+        }
+        pCenter = pAttr;
+        break;
       case AttributeList::AT_HLSLNoPerspective:
         if (pNoPerspective) {
           Diag(pAttr->getLoc(), diag::warn_hlsl_duplicate_specifier)
@@ -11179,6 +11189,14 @@ bool Sema::DiagnoseHLSLDecl(Declarator &D, DeclContext *DC,
     Diag(pCentroid->getLoc(), diag::warn_hlsl_specifier_overridden)
         << pCentroid->getName() << pSample->getName() << pCentroid->getRange();
   }
+  if (pCenter && pCentroid) {
+    Diag(pCenter->getLoc(), diag::warn_hlsl_specifier_overridden)
+      << pCenter->getName() << pCentroid->getName() << pCenter->getRange();
+  }
+  if (pSample && pCenter) {
+    Diag(pCenter->getLoc(), diag::warn_hlsl_specifier_overridden)
+      << pCenter->getName() << pSample->getName() << pCenter->getRange();
+  }
   clang::AttributeList *pNonUniformAttr = pAnyLinear ? pAnyLinear : (
     pNoInterpolation ? pNoInterpolation : pTopology);
   if (pUniform && pNonUniformAttr) {
@@ -11466,6 +11484,10 @@ void hlsl::CustomPrintHLSLAttr(const clang::Attr *A, llvm::raw_ostream &Out, con
     Out << "linear ";
     break;
 
+  case clang::attr::HLSLCenter:
+    Out << "center ";
+    break;
+
   case clang::attr::HLSLCentroid:
     Out << "centroid ";
     break;
@@ -11742,6 +11764,7 @@ bool hlsl::IsHLSLAttr(clang::attr::Kind AttrKind) {
   case clang::attr::HLSLInOut:
   case clang::attr::HLSLInstance:
   case clang::attr::HLSLLinear:
+  case clang::attr::HLSLCenter:
   case clang::attr::HLSLLoop:
   case clang::attr::HLSLMaxTessFactor:
   case clang::attr::HLSLNoInterpolation:

+ 11 - 0
tools/clang/test/CodeGenHLSL/quick-test/center_kwd.hlsl

@@ -0,0 +1,11 @@
+// RUN: %dxc -T ps_6_0 -Od -E main %s | FileCheck %s 
+
+// CHECK: %center = alloca float, align 4
+
+// make sure 'center' is allowed as an interpolation modifier
+float main(center float t : T) : SV_TARGET
+{
+    // and also as an identifier
+    float center = 10.0f;
+    return center * 2;
+}

+ 19 - 0
tools/clang/test/CodeGenHLSL/quick-test/sample_kwd.hlsl

@@ -0,0 +1,19 @@
+// RUN: %dxc -T ps_6_0 -Od -E main %s | FileCheck %s 
+
+// CHECK: %precise = alloca float, align 4
+// CHECK: %globallycoherent = alloca float, align 4
+// CHECK: %sample = alloca float, align 4
+
+// Make sure 'precise', 'globallycoherent' and 'sample' can be used as identifiers (FXC back-compat)
+float3 foo(float3 sample) {
+    return sample;
+}
+
+float3 main(float4 input : SV_POSITION) : SV_TARGET
+{
+    float precise = 1.0f;
+    float globallycoherent = 1.0f;
+    float sample = 1.0f;
+    
+    return foo(float3(precise, globallycoherent, sample));
+}

+ 168 - 46
tools/clang/test/HLSL/varmods-syntax.hlsl

@@ -37,9 +37,12 @@ def gen_pairs(items):
             yield (item, item2)
 def make_trunc(num):
     def trunc(s):
-        return s[:num]
+        if s == "center":
+            return "ctr"
+        else:
+            return s[:num]
     return trunc
-linear_mods = ['linear', 'sample', 'noperspective', 'centroid']
+linear_mods = ['linear', 'sample', 'noperspective', 'centroid', 'center']
 interp_combos = [('nointerpolation',)] + [('nointerpolation', mod) for mod in linear_mods] + list(gen_combos(linear_mods))
 storage_mods = 'groupshared extern precise static uniform volatile const'.split()
 bad_storage_combos = [('groupshared', 'extern'),
@@ -67,25 +70,25 @@ groupshared float2 g_gro;
 groupshared precise float2 g_gro_pre;
 groupshared precise static float2 g_gro_pre_sta;
 groupshared precise static volatile float2 g_gro_pre_sta_vol;    /* expected-error {{'volatile' is not a valid modifier for a global variable}} fxc-error {{X3008: 'g_gro_pre_sta_vol': global variables cannot be declared 'volatile'}} */
-groupshared precise static volatile const float2 g_gro_pre_sta_vol_con;    /* expected-error {{'volatile' is not a valid modifier for a global variable}} fxc-error {{X3008: 'g_gro_pre_sta_vol_con': global variables cannot be declared 'volatile'}} fxc-error {{X3012: 'g_gro_pre_sta_vol_con': missing initial value}} */
+groupshared precise static volatile const float2 g_gro_pre_sta_vol_con;    /* expected-error {{'volatile' is not a valid modifier for a global variable}} fxc-error {{X3008: 'g_gro_pre_sta_vol_con': global variables cannot be declared 'volatile'}} */
 groupshared precise static const float2 g_gro_pre_sta_con;                 /* fxc-error {{X3012: 'g_gro_pre_sta_con': missing initial value}} */
 groupshared precise uniform float2 g_gro_pre_uni;                          /* fxc-error {{X3010: 'g_gro_pre_uni': uniform global variables cannot be declared 'groupshared'}} */
 groupshared precise uniform volatile float2 g_gro_pre_uni_vol;    /* expected-error {{'volatile' is not a valid modifier for a global variable}} fxc-error {{X3008: 'g_gro_pre_uni_vol': global variables cannot be declared 'volatile'}} fxc-error {{X3010: 'g_gro_pre_uni_vol': uniform global variables cannot be declared 'groupshared'}} */
 groupshared precise uniform volatile const float2 g_gro_pre_uni_vol_con;    /* expected-error {{'volatile' is not a valid modifier for a global variable}} fxc-error {{X3008: 'g_gro_pre_uni_vol_con': global variables cannot be declared 'volatile'}} fxc-error {{X3010: 'g_gro_pre_uni_vol_con': uniform global variables cannot be declared 'groupshared'}} */
 groupshared precise uniform const float2 g_gro_pre_uni_con;                 /* fxc-error {{X3010: 'g_gro_pre_uni_con': uniform global variables cannot be declared 'groupshared'}} */
 groupshared precise volatile float2 g_gro_pre_vol;          /* expected-error {{'volatile' is not a valid modifier for a global variable}} fxc-error {{X3008: 'g_gro_pre_vol': global variables cannot be declared 'volatile'}} */
-groupshared precise volatile const float2 g_gro_pre_vol_con;    /* expected-error {{'volatile' is not a valid modifier for a global variable}} fxc-error {{X3008: 'g_gro_pre_vol_con': global variables cannot be declared 'volatile'}} fxc-error {{X3012: 'g_gro_pre_vol_con': missing initial value}} */
+groupshared precise volatile const float2 g_gro_pre_vol_con;    /* expected-error {{'volatile' is not a valid modifier for a global variable}} fxc-error {{X3008: 'g_gro_pre_vol_con': global variables cannot be declared 'volatile'}} */
 groupshared precise const float2 g_gro_pre_con;                 /* fxc-error {{X3012: 'g_gro_pre_con': missing initial value}} */
 groupshared static float2 g_gro_sta;
 groupshared static volatile float2 g_gro_sta_vol;           /* expected-error {{'volatile' is not a valid modifier for a global variable}} fxc-error {{X3008: 'g_gro_sta_vol': global variables cannot be declared 'volatile'}} */
-groupshared static volatile const float2 g_gro_sta_vol_con; /* expected-error {{'volatile' is not a valid modifier for a global variable}} fxc-error {{X3008: 'g_gro_sta_vol_con': global variables cannot be declared 'volatile'}} fxc-error {{X3012: 'g_gro_sta_vol_con': missing initial value}} */
+groupshared static volatile const float2 g_gro_sta_vol_con; /* expected-error {{'volatile' is not a valid modifier for a global variable}} fxc-error {{X3008: 'g_gro_sta_vol_con': global variables cannot be declared 'volatile'}} */
 groupshared static const float2 g_gro_sta_con;              /* fxc-error {{X3012: 'g_gro_sta_con': missing initial value}} */
 groupshared uniform float2 g_gro_uni;                       /* fxc-error {{X3010: 'g_gro_uni': uniform global variables cannot be declared 'groupshared'}} */
 groupshared uniform volatile float2 g_gro_uni_vol;          /* expected-error {{'volatile' is not a valid modifier for a global variable}} fxc-error {{X3008: 'g_gro_uni_vol': global variables cannot be declared 'volatile'}} fxc-error {{X3010: 'g_gro_uni_vol': uniform global variables cannot be declared 'groupshared'}} */
 groupshared uniform volatile const float2 g_gro_uni_vol_con;    /* expected-error {{'volatile' is not a valid modifier for a global variable}} fxc-error {{X3008: 'g_gro_uni_vol_con': global variables cannot be declared 'volatile'}} fxc-error {{X3010: 'g_gro_uni_vol_con': uniform global variables cannot be declared 'groupshared'}} */
 groupshared uniform const float2 g_gro_uni_con;                 /* fxc-error {{X3010: 'g_gro_uni_con': uniform global variables cannot be declared 'groupshared'}} */
 groupshared volatile float2 g_gro_vol;                      /* expected-error {{'volatile' is not a valid modifier for a global variable}} fxc-error {{X3008: 'g_gro_vol': global variables cannot be declared 'volatile'}} */
-groupshared volatile const float2 g_gro_vol_con;            /* expected-error {{'volatile' is not a valid modifier for a global variable}} fxc-error {{X3008: 'g_gro_vol_con': global variables cannot be declared 'volatile'}} fxc-error {{X3012: 'g_gro_vol_con': missing initial value}} */
+groupshared volatile const float2 g_gro_vol_con;            /* expected-error {{'volatile' is not a valid modifier for a global variable}} fxc-error {{X3008: 'g_gro_vol_con': global variables cannot be declared 'volatile'}} */
 groupshared const float2 g_gro_con;                         /* fxc-error {{X3012: 'g_gro_con': missing initial value}} */
 extern float2 g_ext;
 extern precise float2 g_ext_pre;
@@ -206,21 +209,38 @@ nointerpolation linear float2 g_noi_lin;                    /* expected-error {{
 nointerpolation sample float2 g_noi_sam;                    /* expected-error {{'nointerpolation' and 'sample' cannot be used together for a global variable}} expected-error {{'nointerpolation' is not a valid modifier for a global variable}} expected-error {{'sample' is not a valid modifier for a global variable}} fxc-pass {{}} */
 nointerpolation noperspective float2 g_noi_nop;             /* expected-error {{'nointerpolation' and 'noperspective' cannot be used together for a global variable}} expected-error {{'nointerpolation' is not a valid modifier for a global variable}} expected-error {{'noperspective' is not a valid modifier for a global variable}} fxc-error {{X3048: constinterp usage cannot be used with linear, noperspective, or centroid usage}} */
 nointerpolation centroid float2 g_noi_cen;                  /* expected-error {{'centroid' is not a valid modifier for a global variable}} expected-error {{'nointerpolation' and 'centroid' cannot be used together for a global variable}} expected-error {{'nointerpolation' is not a valid modifier for a global variable}} fxc-error {{X3048: constinterp usage cannot be used with linear, noperspective, or centroid usage}} */
+nointerpolation center float2 g_noi_ctr;                    /* expected-error {{'center' is not a valid modifier for a global variable}} expected-error {{'nointerpolation' and 'center' cannot be used together for a global variable}} expected-error {{'nointerpolation' is not a valid modifier for a global variable}} fxc-pass {{}} */
 linear float2 g_lin;                                        /* expected-error {{'linear' is not a valid modifier for a global variable}} fxc-pass {{}} */
 linear sample float2 g_lin_sam;                             /* expected-error {{'linear' is not a valid modifier for a global variable}} expected-error {{'sample' is not a valid modifier for a global variable}} fxc-pass {{}} */
 linear sample noperspective float2 g_lin_sam_nop;           /* expected-error {{'linear' is not a valid modifier for a global variable}} expected-error {{'noperspective' is not a valid modifier for a global variable}} expected-error {{'sample' is not a valid modifier for a global variable}} fxc-pass {{}} */
 linear sample noperspective centroid float2 g_lin_sam_nop_cen;    /* expected-error {{'centroid' is not a valid modifier for a global variable}} expected-error {{'linear' is not a valid modifier for a global variable}} expected-error {{'noperspective' is not a valid modifier for a global variable}} expected-error {{'sample' is not a valid modifier for a global variable}} expected-warning {{'centroid' will be overridden by 'sample'}} fxc-pass {{}} */
+linear sample noperspective centroid center float2 g_lin_sam_nop_cen_ctr;    /* expected-error {{'center' is not a valid modifier for a global variable}} expected-error {{'centroid' is not a valid modifier for a global variable}} expected-error {{'linear' is not a valid modifier for a global variable}} expected-error {{'noperspective' is not a valid modifier for a global variable}} expected-error {{'sample' is not a valid modifier for a global variable}} expected-warning {{'center' will be overridden by 'centroid'}} expected-warning {{'center' will be overridden by 'sample'}} expected-warning {{'centroid' will be overridden by 'sample'}} fxc-pass {{}} */
+linear sample noperspective center float2 g_lin_sam_nop_ctr;      /* expected-error {{'center' is not a valid modifier for a global variable}} expected-error {{'linear' is not a valid modifier for a global variable}} expected-error {{'noperspective' is not a valid modifier for a global variable}} expected-error {{'sample' is not a valid modifier for a global variable}} expected-warning {{'center' will be overridden by 'sample'}} fxc-pass {{}} */
 linear sample centroid float2 g_lin_sam_cen;                /* expected-error {{'centroid' is not a valid modifier for a global variable}} expected-error {{'linear' is not a valid modifier for a global variable}} expected-error {{'sample' is not a valid modifier for a global variable}} expected-warning {{'centroid' will be overridden by 'sample'}} fxc-pass {{}} */
+linear sample centroid center float2 g_lin_sam_cen_ctr;     /* expected-error {{'center' is not a valid modifier for a global variable}} expected-error {{'centroid' is not a valid modifier for a global variable}} expected-error {{'linear' is not a valid modifier for a global variable}} expected-error {{'sample' is not a valid modifier for a global variable}} expected-warning {{'center' will be overridden by 'centroid'}} expected-warning {{'center' will be overridden by 'sample'}} expected-warning {{'centroid' will be overridden by 'sample'}} fxc-pass {{}} */
+linear sample center float2 g_lin_sam_ctr;                  /* expected-error {{'center' is not a valid modifier for a global variable}} expected-error {{'linear' is not a valid modifier for a global variable}} expected-error {{'sample' is not a valid modifier for a global variable}} expected-warning {{'center' will be overridden by 'sample'}} fxc-pass {{}} */
 linear noperspective float2 g_lin_nop;                      /* expected-error {{'linear' is not a valid modifier for a global variable}} expected-error {{'noperspective' is not a valid modifier for a global variable}} fxc-pass {{}} */
 linear noperspective centroid float2 g_lin_nop_cen;         /* expected-error {{'centroid' is not a valid modifier for a global variable}} expected-error {{'linear' is not a valid modifier for a global variable}} expected-error {{'noperspective' is not a valid modifier for a global variable}} fxc-pass {{}} */
+linear noperspective centroid center float2 g_lin_nop_cen_ctr;    /* expected-error {{'center' is not a valid modifier for a global variable}} expected-error {{'centroid' is not a valid modifier for a global variable}} expected-error {{'linear' is not a valid modifier for a global variable}} expected-error {{'noperspective' is not a valid modifier for a global variable}} expected-warning {{'center' will be overridden by 'centroid'}} fxc-pass {{}} */
+linear noperspective center float2 g_lin_nop_ctr;           /* expected-error {{'center' is not a valid modifier for a global variable}} expected-error {{'linear' is not a valid modifier for a global variable}} expected-error {{'noperspective' is not a valid modifier for a global variable}} fxc-pass {{}} */
 linear centroid float2 g_lin_cen;                           /* expected-error {{'centroid' is not a valid modifier for a global variable}} expected-error {{'linear' is not a valid modifier for a global variable}} fxc-pass {{}} */
+linear centroid center float2 g_lin_cen_ctr;                /* expected-error {{'center' is not a valid modifier for a global variable}} expected-error {{'centroid' is not a valid modifier for a global variable}} expected-error {{'linear' is not a valid modifier for a global variable}} expected-warning {{'center' will be overridden by 'centroid'}} fxc-pass {{}} */
+linear center float2 g_lin_ctr;                             /* expected-error {{'center' is not a valid modifier for a global variable}} expected-error {{'linear' is not a valid modifier for a global variable}} fxc-pass {{}} */
 sample float2 g_sam;                                        /* expected-error {{'sample' is not a valid modifier for a global variable}} fxc-pass {{}} */
 sample noperspective float2 g_sam_nop;                      /* expected-error {{'noperspective' is not a valid modifier for a global variable}} expected-error {{'sample' is not a valid modifier for a global variable}} fxc-pass {{}} */
 sample noperspective centroid float2 g_sam_nop_cen;         /* expected-error {{'centroid' is not a valid modifier for a global variable}} expected-error {{'noperspective' is not a valid modifier for a global variable}} expected-error {{'sample' is not a valid modifier for a global variable}} expected-warning {{'centroid' will be overridden by 'sample'}} fxc-pass {{}} */
+sample noperspective centroid center float2 g_sam_nop_cen_ctr;    /* expected-error {{'center' is not a valid modifier for a global variable}} expected-error {{'centroid' is not a valid modifier for a global variable}} expected-error {{'noperspective' is not a valid modifier for a global variable}} expected-error {{'sample' is not a valid modifier for a global variable}} expected-warning {{'center' will be overridden by 'centroid'}} expected-warning {{'center' will be overridden by 'sample'}} expected-warning {{'centroid' will be overridden by 'sample'}} fxc-pass {{}} */
+sample noperspective center float2 g_sam_nop_ctr;           /* expected-error {{'center' is not a valid modifier for a global variable}} expected-error {{'noperspective' is not a valid modifier for a global variable}} expected-error {{'sample' is not a valid modifier for a global variable}} expected-warning {{'center' will be overridden by 'sample'}} fxc-pass {{}} */
 sample centroid float2 g_sam_cen;                           /* expected-error {{'centroid' is not a valid modifier for a global variable}} expected-error {{'sample' is not a valid modifier for a global variable}} expected-warning {{'centroid' will be overridden by 'sample'}} fxc-pass {{}} */
+sample centroid center float2 g_sam_cen_ctr;                /* expected-error {{'center' is not a valid modifier for a global variable}} expected-error {{'centroid' is not a valid modifier for a global variable}} expected-error {{'sample' is not a valid modifier for a global variable}} expected-warning {{'center' will be overridden by 'centroid'}} expected-warning {{'center' will be overridden by 'sample'}} expected-warning {{'centroid' will be overridden by 'sample'}} fxc-pass {{}} */
+sample center float2 g_sam_ctr;                             /* expected-error {{'center' is not a valid modifier for a global variable}} expected-error {{'sample' is not a valid modifier for a global variable}} expected-warning {{'center' will be overridden by 'sample'}} fxc-pass {{}} */
 noperspective float2 g_nop;                                 /* expected-error {{'noperspective' is not a valid modifier for a global variable}} fxc-pass {{}} */
 noperspective centroid float2 g_nop_cen;                    /* expected-error {{'centroid' is not a valid modifier for a global variable}} expected-error {{'noperspective' is not a valid modifier for a global variable}} fxc-pass {{}} */
+noperspective centroid center float2 g_nop_cen_ctr;         /* expected-error {{'center' is not a valid modifier for a global variable}} expected-error {{'centroid' is not a valid modifier for a global variable}} expected-error {{'noperspective' is not a valid modifier for a global variable}} expected-warning {{'center' will be overridden by 'centroid'}} fxc-pass {{}} */
+noperspective center float2 g_nop_ctr;                      /* expected-error {{'center' is not a valid modifier for a global variable}} expected-error {{'noperspective' is not a valid modifier for a global variable}} fxc-pass {{}} */
 centroid float2 g_cen;                                      /* expected-error {{'centroid' is not a valid modifier for a global variable}} fxc-pass {{}} */
+centroid center float2 g_cen_ctr;                           /* expected-error {{'center' is not a valid modifier for a global variable}} expected-error {{'centroid' is not a valid modifier for a global variable}} expected-warning {{'center' will be overridden by 'centroid'}} fxc-pass {{}} */
+center float2 g_ctr;                                        /* expected-error {{'center' is not a valid modifier for a global variable}} fxc-pass {{}} */
 // GENERATED_CODE:END
 
 in float g_in;                                              /* expected-error {{HLSL usage 'in' is only valid on a parameter}} fxc-error {{X3000: syntax error: unexpected token 'in'}} */
@@ -311,21 +331,38 @@ typedef nointerpolation linear float2 t_noi_lin;            /* expected-error {{
 typedef nointerpolation sample float2 t_noi_sam;            /* expected-error {{'nointerpolation' and 'sample' cannot be used together for a typedef}} expected-error {{'nointerpolation' is not a valid modifier for a typedef}} expected-error {{'sample' is not a valid modifier for a typedef}} fxc-error {{X3000: syntax error: unexpected token 'nointerpolation'}} */
 typedef nointerpolation noperspective float2 t_noi_nop;     /* expected-error {{'nointerpolation' and 'noperspective' cannot be used together for a typedef}} expected-error {{'nointerpolation' is not a valid modifier for a typedef}} expected-error {{'noperspective' is not a valid modifier for a typedef}} fxc-error {{X3000: syntax error: unexpected token 'nointerpolation'}} */
 typedef nointerpolation centroid float2 t_noi_cen;          /* expected-error {{'centroid' is not a valid modifier for a typedef}} expected-error {{'nointerpolation' and 'centroid' cannot be used together for a typedef}} expected-error {{'nointerpolation' is not a valid modifier for a typedef}} fxc-error {{X3000: syntax error: unexpected token 'nointerpolation'}} */
+typedef nointerpolation center float2 t_noi_ctr;            /* expected-error {{'center' is not a valid modifier for a typedef}} expected-error {{'nointerpolation' and 'center' cannot be used together for a typedef}} expected-error {{'nointerpolation' is not a valid modifier for a typedef}} fxc-error {{X3000: syntax error: unexpected token 'nointerpolation'}} */
 typedef linear float2 t_lin;                                /* expected-error {{'linear' is not a valid modifier for a typedef}} fxc-error {{X3000: syntax error: unexpected token 'linear'}} */
 typedef linear sample float2 t_lin_sam;                     /* expected-error {{'linear' is not a valid modifier for a typedef}} expected-error {{'sample' is not a valid modifier for a typedef}} fxc-error {{X3000: syntax error: unexpected token 'linear'}} */
 typedef linear sample noperspective float2 t_lin_sam_nop;   /* expected-error {{'linear' is not a valid modifier for a typedef}} expected-error {{'noperspective' is not a valid modifier for a typedef}} expected-error {{'sample' is not a valid modifier for a typedef}} fxc-error {{X3000: syntax error: unexpected token 'linear'}} */
 typedef linear sample noperspective centroid float2 t_lin_sam_nop_cen;    /* expected-error {{'centroid' is not a valid modifier for a typedef}} expected-error {{'linear' is not a valid modifier for a typedef}} expected-error {{'noperspective' is not a valid modifier for a typedef}} expected-error {{'sample' is not a valid modifier for a typedef}} expected-warning {{'centroid' will be overridden by 'sample'}} fxc-error {{X3000: syntax error: unexpected token 'linear'}} */
+typedef linear sample noperspective centroid center float2 t_lin_sam_nop_cen_ctr;    /* expected-error {{'center' is not a valid modifier for a typedef}} expected-error {{'centroid' is not a valid modifier for a typedef}} expected-error {{'linear' is not a valid modifier for a typedef}} expected-error {{'noperspective' is not a valid modifier for a typedef}} expected-error {{'sample' is not a valid modifier for a typedef}} expected-warning {{'center' will be overridden by 'centroid'}} expected-warning {{'center' will be overridden by 'sample'}} expected-warning {{'centroid' will be overridden by 'sample'}} fxc-error {{X3000: syntax error: unexpected token 'linear'}} */
+typedef linear sample noperspective center float2 t_lin_sam_nop_ctr;      /* expected-error {{'center' is not a valid modifier for a typedef}} expected-error {{'linear' is not a valid modifier for a typedef}} expected-error {{'noperspective' is not a valid modifier for a typedef}} expected-error {{'sample' is not a valid modifier for a typedef}} expected-warning {{'center' will be overridden by 'sample'}} fxc-error {{X3000: syntax error: unexpected token 'linear'}} */
 typedef linear sample centroid float2 t_lin_sam_cen;        /* expected-error {{'centroid' is not a valid modifier for a typedef}} expected-error {{'linear' is not a valid modifier for a typedef}} expected-error {{'sample' is not a valid modifier for a typedef}} expected-warning {{'centroid' will be overridden by 'sample'}} fxc-error {{X3000: syntax error: unexpected token 'linear'}} */
+typedef linear sample centroid center float2 t_lin_sam_cen_ctr;    /* expected-error {{'center' is not a valid modifier for a typedef}} expected-error {{'centroid' is not a valid modifier for a typedef}} expected-error {{'linear' is not a valid modifier for a typedef}} expected-error {{'sample' is not a valid modifier for a typedef}} expected-warning {{'center' will be overridden by 'centroid'}} expected-warning {{'center' will be overridden by 'sample'}} expected-warning {{'centroid' will be overridden by 'sample'}} fxc-error {{X3000: syntax error: unexpected token 'linear'}} */
+typedef linear sample center float2 t_lin_sam_ctr;          /* expected-error {{'center' is not a valid modifier for a typedef}} expected-error {{'linear' is not a valid modifier for a typedef}} expected-error {{'sample' is not a valid modifier for a typedef}} expected-warning {{'center' will be overridden by 'sample'}} fxc-error {{X3000: syntax error: unexpected token 'linear'}} */
 typedef linear noperspective float2 t_lin_nop;              /* expected-error {{'linear' is not a valid modifier for a typedef}} expected-error {{'noperspective' is not a valid modifier for a typedef}} fxc-error {{X3000: syntax error: unexpected token 'linear'}} */
 typedef linear noperspective centroid float2 t_lin_nop_cen; /* expected-error {{'centroid' is not a valid modifier for a typedef}} expected-error {{'linear' is not a valid modifier for a typedef}} expected-error {{'noperspective' is not a valid modifier for a typedef}} fxc-error {{X3000: syntax error: unexpected token 'linear'}} */
+typedef linear noperspective centroid center float2 t_lin_nop_cen_ctr;    /* expected-error {{'center' is not a valid modifier for a typedef}} expected-error {{'centroid' is not a valid modifier for a typedef}} expected-error {{'linear' is not a valid modifier for a typedef}} expected-error {{'noperspective' is not a valid modifier for a typedef}} expected-warning {{'center' will be overridden by 'centroid'}} fxc-error {{X3000: syntax error: unexpected token 'linear'}} */
+typedef linear noperspective center float2 t_lin_nop_ctr;   /* expected-error {{'center' is not a valid modifier for a typedef}} expected-error {{'linear' is not a valid modifier for a typedef}} expected-error {{'noperspective' is not a valid modifier for a typedef}} fxc-error {{X3000: syntax error: unexpected token 'linear'}} */
 typedef linear centroid float2 t_lin_cen;                   /* expected-error {{'centroid' is not a valid modifier for a typedef}} expected-error {{'linear' is not a valid modifier for a typedef}} fxc-error {{X3000: syntax error: unexpected token 'linear'}} */
+typedef linear centroid center float2 t_lin_cen_ctr;        /* expected-error {{'center' is not a valid modifier for a typedef}} expected-error {{'centroid' is not a valid modifier for a typedef}} expected-error {{'linear' is not a valid modifier for a typedef}} expected-warning {{'center' will be overridden by 'centroid'}} fxc-error {{X3000: syntax error: unexpected token 'linear'}} */
+typedef linear center float2 t_lin_ctr;                     /* expected-error {{'center' is not a valid modifier for a typedef}} expected-error {{'linear' is not a valid modifier for a typedef}} fxc-error {{X3000: syntax error: unexpected token 'linear'}} */
 typedef sample float2 t_sam;                                /* expected-error {{'sample' is not a valid modifier for a typedef}} fxc-pass {{}} */
 typedef sample noperspective float2 t_sam_nop;              /* expected-error {{'noperspective' is not a valid modifier for a typedef}} expected-error {{'sample' is not a valid modifier for a typedef}} fxc-error {{X3000: syntax error: unexpected token 'noperspective'}} */
 typedef sample noperspective centroid float2 t_sam_nop_cen; /* expected-error {{'centroid' is not a valid modifier for a typedef}} expected-error {{'noperspective' is not a valid modifier for a typedef}} expected-error {{'sample' is not a valid modifier for a typedef}} expected-warning {{'centroid' will be overridden by 'sample'}} fxc-error {{X3000: syntax error: unexpected token 'noperspective'}} */
+typedef sample noperspective centroid center float2 t_sam_nop_cen_ctr;    /* expected-error {{'center' is not a valid modifier for a typedef}} expected-error {{'centroid' is not a valid modifier for a typedef}} expected-error {{'noperspective' is not a valid modifier for a typedef}} expected-error {{'sample' is not a valid modifier for a typedef}} expected-warning {{'center' will be overridden by 'centroid'}} expected-warning {{'center' will be overridden by 'sample'}} expected-warning {{'centroid' will be overridden by 'sample'}} fxc-error {{X3000: syntax error: unexpected token 'noperspective'}} */
+typedef sample noperspective center float2 t_sam_nop_ctr;   /* expected-error {{'center' is not a valid modifier for a typedef}} expected-error {{'noperspective' is not a valid modifier for a typedef}} expected-error {{'sample' is not a valid modifier for a typedef}} expected-warning {{'center' will be overridden by 'sample'}} fxc-error {{X3000: syntax error: unexpected token 'noperspective'}} */
 typedef sample centroid float2 t_sam_cen;                   /* expected-error {{'centroid' is not a valid modifier for a typedef}} expected-error {{'sample' is not a valid modifier for a typedef}} expected-warning {{'centroid' will be overridden by 'sample'}} fxc-error {{X3000: syntax error: unexpected token 'centroid'}} */
+typedef sample centroid center float2 t_sam_cen_ctr;        /* expected-error {{'center' is not a valid modifier for a typedef}} expected-error {{'centroid' is not a valid modifier for a typedef}} expected-error {{'sample' is not a valid modifier for a typedef}} expected-warning {{'center' will be overridden by 'centroid'}} expected-warning {{'center' will be overridden by 'sample'}} expected-warning {{'centroid' will be overridden by 'sample'}} fxc-error {{X3000: syntax error: unexpected token 'centroid'}} */
+typedef sample center float2 t_sam_ctr;                     /* expected-error {{'center' is not a valid modifier for a typedef}} expected-error {{'sample' is not a valid modifier for a typedef}} expected-warning {{'center' will be overridden by 'sample'}} fxc-pass {{}} */
 typedef noperspective float2 t_nop;                         /* expected-error {{'noperspective' is not a valid modifier for a typedef}} fxc-error {{X3000: syntax error: unexpected token 'noperspective'}} */
 typedef noperspective centroid float2 t_nop_cen;            /* expected-error {{'centroid' is not a valid modifier for a typedef}} expected-error {{'noperspective' is not a valid modifier for a typedef}} fxc-error {{X3000: syntax error: unexpected token 'noperspective'}} */
+typedef noperspective centroid center float2 t_nop_cen_ctr; /* expected-error {{'center' is not a valid modifier for a typedef}} expected-error {{'centroid' is not a valid modifier for a typedef}} expected-error {{'noperspective' is not a valid modifier for a typedef}} expected-warning {{'center' will be overridden by 'centroid'}} fxc-error {{X3000: syntax error: unexpected token 'noperspective'}} */
+typedef noperspective center float2 t_nop_ctr;              /* expected-error {{'center' is not a valid modifier for a typedef}} expected-error {{'noperspective' is not a valid modifier for a typedef}} fxc-error {{X3000: syntax error: unexpected token 'noperspective'}} */
 typedef centroid float2 t_cen;                              /* expected-error {{'centroid' is not a valid modifier for a typedef}} fxc-error {{X3000: syntax error: unexpected token 'centroid'}} */
+typedef centroid center float2 t_cen_ctr;                   /* expected-error {{'center' is not a valid modifier for a typedef}} expected-error {{'centroid' is not a valid modifier for a typedef}} expected-warning {{'center' will be overridden by 'centroid'}} fxc-error {{X3000: syntax error: unexpected token 'centroid'}} */
+typedef center float2 t_ctr;                                /* expected-error {{'center' is not a valid modifier for a typedef}} fxc-pass {{}} */
 // GENERATED_CODE:END
 
 typedef in float2 t_in;                                     /* expected-error {{HLSL usage 'in' is only valid on a parameter}} fxc-error {{X3000: syntax error: unexpected token 'in'}} */
@@ -415,21 +452,38 @@ struct s_interp_mods {
     nointerpolation sample float2 f_noi_sam;                /* expected-error {{'nointerpolation' and 'sample' cannot be used together for a field}} fxc-pass {{}} */
     nointerpolation noperspective float2 f_noi_nop;         /* expected-error {{'nointerpolation' and 'noperspective' cannot be used together for a field}} fxc-error {{X3048: constinterp usage cannot be used with linear, noperspective, or centroid usage}} */
     nointerpolation centroid float2 f_noi_cen;              /* expected-error {{'nointerpolation' and 'centroid' cannot be used together for a field}} fxc-error {{X3048: constinterp usage cannot be used with linear, noperspective, or centroid usage}} */
+    nointerpolation center float2 f_noi_ctr;                /* expected-error {{'nointerpolation' and 'center' cannot be used together for a field}} fxc-pass {{}} */
     linear float2 f_lin;
     linear sample float2 f_lin_sam;
     linear sample noperspective float2 f_lin_sam_nop;
     linear sample noperspective centroid float2 f_lin_sam_nop_cen;    /* expected-warning {{'centroid' will be overridden by 'sample'}} fxc-pass {{}} */
+    linear sample noperspective centroid center float2 f_lin_sam_nop_cen_ctr;    /* expected-warning {{'center' will be overridden by 'centroid'}} expected-warning {{'center' will be overridden by 'sample'}} expected-warning {{'centroid' will be overridden by 'sample'}} fxc-pass {{}} */
+    linear sample noperspective center float2 f_lin_sam_nop_ctr;      /* expected-warning {{'center' will be overridden by 'sample'}} fxc-pass {{}} */
     linear sample centroid float2 f_lin_sam_cen;            /* expected-warning {{'centroid' will be overridden by 'sample'}} fxc-pass {{}} */
+    linear sample centroid center float2 f_lin_sam_cen_ctr; /* expected-warning {{'center' will be overridden by 'centroid'}} expected-warning {{'center' will be overridden by 'sample'}} expected-warning {{'centroid' will be overridden by 'sample'}} fxc-pass {{}} */
+    linear sample center float2 f_lin_sam_ctr;              /* expected-warning {{'center' will be overridden by 'sample'}} fxc-pass {{}} */
     linear noperspective float2 f_lin_nop;
     linear noperspective centroid float2 f_lin_nop_cen;
+    linear noperspective centroid center float2 f_lin_nop_cen_ctr;    /* expected-warning {{'center' will be overridden by 'centroid'}} fxc-pass {{}} */
+    linear noperspective center float2 f_lin_nop_ctr;
     linear centroid float2 f_lin_cen;
+    linear centroid center float2 f_lin_cen_ctr;            /* expected-warning {{'center' will be overridden by 'centroid'}} fxc-pass {{}} */
+    linear center float2 f_lin_ctr;
     sample float2 f_sam;
     sample noperspective float2 f_sam_nop;
     sample noperspective centroid float2 f_sam_nop_cen;     /* expected-warning {{'centroid' will be overridden by 'sample'}} fxc-pass {{}} */
+    sample noperspective centroid center float2 f_sam_nop_cen_ctr;    /* expected-warning {{'center' will be overridden by 'centroid'}} expected-warning {{'center' will be overridden by 'sample'}} expected-warning {{'centroid' will be overridden by 'sample'}} fxc-pass {{}} */
+    sample noperspective center float2 f_sam_nop_ctr;       /* expected-warning {{'center' will be overridden by 'sample'}} fxc-pass {{}} */
     sample centroid float2 f_sam_cen;                       /* expected-warning {{'centroid' will be overridden by 'sample'}} fxc-pass {{}} */
+    sample centroid center float2 f_sam_cen_ctr;            /* expected-warning {{'center' will be overridden by 'centroid'}} expected-warning {{'center' will be overridden by 'sample'}} expected-warning {{'centroid' will be overridden by 'sample'}} fxc-pass {{}} */
+    sample center float2 f_sam_ctr;                         /* expected-warning {{'center' will be overridden by 'sample'}} fxc-pass {{}} */
     noperspective float2 f_nop;
     noperspective centroid float2 f_nop_cen;
+    noperspective centroid center float2 f_nop_cen_ctr;     /* expected-warning {{'center' will be overridden by 'centroid'}} fxc-pass {{}} */
+    noperspective center float2 f_nop_ctr;
     centroid float2 f_cen;
+    centroid center float2 f_cen_ctr;                       /* expected-warning {{'center' will be overridden by 'centroid'}} fxc-pass {{}} */
+    center float2 f_ctr;
     // GENERATED_CODE:END
 };
 
@@ -518,21 +572,38 @@ float4 foo_noi_lin(nointerpolation linear float4 val) { return val; }    /* expe
 float4 foo_noi_sam(nointerpolation sample float4 val) { return val; }    /* expected-error {{'nointerpolation' and 'sample' cannot be used together for a parameter}} fxc-pass {{}} */
 float4 foo_noi_nop(nointerpolation noperspective float4 val) { return val; }    /* expected-error {{'nointerpolation' and 'noperspective' cannot be used together for a parameter}} fxc-error {{X3048: constinterp usage cannot be used with linear, noperspective, or centroid usage}} */
 float4 foo_noi_cen(nointerpolation centroid float4 val) { return val; }    /* expected-error {{'nointerpolation' and 'centroid' cannot be used together for a parameter}} fxc-error {{X3048: constinterp usage cannot be used with linear, noperspective, or centroid usage}} */
+float4 foo_noi_ctr(nointerpolation center float4 val) { return val; }      /* expected-error {{'nointerpolation' and 'center' cannot be used together for a parameter}} fxc-pass {{}} */
 float4 foo_lin(linear float4 val) { return val; }
 float4 foo_lin_sam(linear sample float4 val) { return val; }
 float4 foo_lin_sam_nop(linear sample noperspective float4 val) { return val; }
 float4 foo_lin_sam_nop_cen(linear sample noperspective centroid float4 val) { return val; }    /* expected-warning {{'centroid' will be overridden by 'sample'}} fxc-pass {{}} */
+float4 foo_lin_sam_nop_cen_ctr(linear sample noperspective centroid center float4 val) { return val; }    /* expected-warning {{'center' will be overridden by 'centroid'}} expected-warning {{'center' will be overridden by 'sample'}} expected-warning {{'centroid' will be overridden by 'sample'}} fxc-pass {{}} */
+float4 foo_lin_sam_nop_ctr(linear sample noperspective center float4 val) { return val; }      /* expected-warning {{'center' will be overridden by 'sample'}} fxc-pass {{}} */
 float4 foo_lin_sam_cen(linear sample centroid float4 val) { return val; }    /* expected-warning {{'centroid' will be overridden by 'sample'}} fxc-pass {{}} */
+float4 foo_lin_sam_cen_ctr(linear sample centroid center float4 val) { return val; }    /* expected-warning {{'center' will be overridden by 'centroid'}} expected-warning {{'center' will be overridden by 'sample'}} expected-warning {{'centroid' will be overridden by 'sample'}} fxc-pass {{}} */
+float4 foo_lin_sam_ctr(linear sample center float4 val) { return val; }      /* expected-warning {{'center' will be overridden by 'sample'}} fxc-pass {{}} */
 float4 foo_lin_nop(linear noperspective float4 val) { return val; }
 float4 foo_lin_nop_cen(linear noperspective centroid float4 val) { return val; }
+float4 foo_lin_nop_cen_ctr(linear noperspective centroid center float4 val) { return val; }    /* expected-warning {{'center' will be overridden by 'centroid'}} fxc-pass {{}} */
+float4 foo_lin_nop_ctr(linear noperspective center float4 val) { return val; }
 float4 foo_lin_cen(linear centroid float4 val) { return val; }
+float4 foo_lin_cen_ctr(linear centroid center float4 val) { return val; }    /* expected-warning {{'center' will be overridden by 'centroid'}} fxc-pass {{}} */
+float4 foo_lin_ctr(linear center float4 val) { return val; }
 float4 foo_sam(sample float4 val) { return val; }
 float4 foo_sam_nop(sample noperspective float4 val) { return val; }
 float4 foo_sam_nop_cen(sample noperspective centroid float4 val) { return val; }    /* expected-warning {{'centroid' will be overridden by 'sample'}} fxc-pass {{}} */
+float4 foo_sam_nop_cen_ctr(sample noperspective centroid center float4 val) { return val; }    /* expected-warning {{'center' will be overridden by 'centroid'}} expected-warning {{'center' will be overridden by 'sample'}} expected-warning {{'centroid' will be overridden by 'sample'}} fxc-pass {{}} */
+float4 foo_sam_nop_ctr(sample noperspective center float4 val) { return val; }      /* expected-warning {{'center' will be overridden by 'sample'}} fxc-pass {{}} */
 float4 foo_sam_cen(sample centroid float4 val) { return val; }    /* expected-warning {{'centroid' will be overridden by 'sample'}} fxc-pass {{}} */
+float4 foo_sam_cen_ctr(sample centroid center float4 val) { return val; }    /* expected-warning {{'center' will be overridden by 'centroid'}} expected-warning {{'center' will be overridden by 'sample'}} expected-warning {{'centroid' will be overridden by 'sample'}} fxc-pass {{}} */
+float4 foo_sam_ctr(sample center float4 val) { return val; }      /* expected-warning {{'center' will be overridden by 'sample'}} fxc-pass {{}} */
 float4 foo_nop(noperspective float4 val) { return val; }
 float4 foo_nop_cen(noperspective centroid float4 val) { return val; }
+float4 foo_nop_cen_ctr(noperspective centroid center float4 val) { return val; }    /* expected-warning {{'center' will be overridden by 'centroid'}} fxc-pass {{}} */
+float4 foo_nop_ctr(noperspective center float4 val) { return val; }
 float4 foo_cen(centroid float4 val) { return val; }
+float4 foo_cen_ctr(centroid center float4 val) { return val; }    /* expected-warning {{'center' will be overridden by 'centroid'}} fxc-pass {{}} */
+float4 foo_ctr(center float4 val) { return val; }
 // GENERATED_CODE:END
 
 float4 foo_in(in float4 val) {
@@ -691,38 +762,38 @@ void vain() {
     groupshared precise static const float l_gro_pre_sta_con;    /* expected-error {{'groupshared' is not a valid modifier for a local variable}} fxc-error {{X3010: 'l_gro_pre_sta_con': local variables cannot be declared 'groupshared'}} */
     groupshared precise uniform float l_gro_pre_uni;        /* expected-error {{'groupshared' is not a valid modifier for a local variable}} expected-error {{'uniform' is not a valid modifier for a local variable}} fxc-error {{X3010: 'l_gro_pre_uni': local variables cannot be declared 'groupshared'}} fxc-error {{X3047: 'l_gro_pre_uni': local variables cannot be declared 'uniform'}} */
     groupshared precise uniform volatile float l_gro_pre_uni_vol;    /* expected-error {{'groupshared' is not a valid modifier for a local variable}} expected-error {{'uniform' is not a valid modifier for a local variable}} fxc-error {{X3010: 'l_gro_pre_uni_vol': local variables cannot be declared 'groupshared'}} fxc-error {{X3047: 'l_gro_pre_uni_vol': local variables cannot be declared 'uniform'}} */
-    groupshared precise uniform volatile const float l_gro_pre_uni_vol_con;    /* expected-error {{'groupshared' is not a valid modifier for a local variable}} expected-error {{'uniform' is not a valid modifier for a local variable}} fxc-error {{X3010: 'l_gro_pre_uni_vol_con': local variables cannot be declared 'groupshared'}} fxc-error {{X3012: 'l_gro_pre_uni_vol_con': missing initial value}} fxc-error {{X3047: 'l_gro_pre_uni_vol_con': local variables cannot be declared 'uniform'}} */
-    groupshared precise uniform const float l_gro_pre_uni_con;    /* expected-error {{'groupshared' is not a valid modifier for a local variable}} expected-error {{'uniform' is not a valid modifier for a local variable}} fxc-error {{X3010: 'l_gro_pre_uni_con': local variables cannot be declared 'groupshared'}} fxc-error {{X3012: 'l_gro_pre_uni_con': missing initial value}} fxc-error {{X3047: 'l_gro_pre_uni_con': local variables cannot be declared 'uniform'}} */
+    groupshared precise uniform volatile const float l_gro_pre_uni_vol_con;    /* expected-error {{'groupshared' is not a valid modifier for a local variable}} expected-error {{'uniform' is not a valid modifier for a local variable}} fxc-error {{X3010: 'l_gro_pre_uni_vol_con': local variables cannot be declared 'groupshared'}} fxc-error {{X3047: 'l_gro_pre_uni_vol_con': local variables cannot be declared 'uniform'}} */
+    groupshared precise uniform const float l_gro_pre_uni_con;    /* expected-error {{'groupshared' is not a valid modifier for a local variable}} expected-error {{'uniform' is not a valid modifier for a local variable}} fxc-error {{X3010: 'l_gro_pre_uni_con': local variables cannot be declared 'groupshared'}} fxc-error {{X3047: 'l_gro_pre_uni_con': local variables cannot be declared 'uniform'}} */
     groupshared precise volatile float l_gro_pre_vol;             /* expected-error {{'groupshared' is not a valid modifier for a local variable}} fxc-error {{X3010: 'l_gro_pre_vol': local variables cannot be declared 'groupshared'}} */
-    groupshared precise volatile const float l_gro_pre_vol_con;   /* expected-error {{'groupshared' is not a valid modifier for a local variable}} fxc-error {{X3010: 'l_gro_pre_vol_con': local variables cannot be declared 'groupshared'}} fxc-error {{X3012: 'l_gro_pre_vol_con': missing initial value}} */
-    groupshared precise const float l_gro_pre_con;          /* expected-error {{'groupshared' is not a valid modifier for a local variable}} fxc-error {{X3010: 'l_gro_pre_con': local variables cannot be declared 'groupshared'}} fxc-error {{X3012: 'l_gro_pre_con': missing initial value}} */
+    groupshared precise volatile const float l_gro_pre_vol_con;   /* expected-error {{'groupshared' is not a valid modifier for a local variable}} fxc-error {{X3010: 'l_gro_pre_vol_con': local variables cannot be declared 'groupshared'}} */
+    groupshared precise const float l_gro_pre_con;          /* expected-error {{'groupshared' is not a valid modifier for a local variable}} fxc-error {{X3010: 'l_gro_pre_con': local variables cannot be declared 'groupshared'}} */
     groupshared static float l_gro_sta;                     /* expected-error {{'groupshared' is not a valid modifier for a local variable}} fxc-error {{X3010: 'l_gro_sta': local variables cannot be declared 'groupshared'}} */
     groupshared static volatile float l_gro_sta_vol;        /* expected-error {{'groupshared' is not a valid modifier for a local variable}} fxc-error {{X3010: 'l_gro_sta_vol': local variables cannot be declared 'groupshared'}} */
     groupshared static volatile const float l_gro_sta_vol_con;    /* expected-error {{'groupshared' is not a valid modifier for a local variable}} fxc-error {{X3010: 'l_gro_sta_vol_con': local variables cannot be declared 'groupshared'}} */
     groupshared static const float l_gro_sta_con;           /* expected-error {{'groupshared' is not a valid modifier for a local variable}} fxc-error {{X3010: 'l_gro_sta_con': local variables cannot be declared 'groupshared'}} */
     groupshared uniform float l_gro_uni;                    /* expected-error {{'groupshared' is not a valid modifier for a local variable}} expected-error {{'uniform' is not a valid modifier for a local variable}} fxc-error {{X3010: 'l_gro_uni': local variables cannot be declared 'groupshared'}} fxc-error {{X3047: 'l_gro_uni': local variables cannot be declared 'uniform'}} */
     groupshared uniform volatile float l_gro_uni_vol;       /* expected-error {{'groupshared' is not a valid modifier for a local variable}} expected-error {{'uniform' is not a valid modifier for a local variable}} fxc-error {{X3010: 'l_gro_uni_vol': local variables cannot be declared 'groupshared'}} fxc-error {{X3047: 'l_gro_uni_vol': local variables cannot be declared 'uniform'}} */
-    groupshared uniform volatile const float l_gro_uni_vol_con;    /* expected-error {{'groupshared' is not a valid modifier for a local variable}} expected-error {{'uniform' is not a valid modifier for a local variable}} fxc-error {{X3010: 'l_gro_uni_vol_con': local variables cannot be declared 'groupshared'}} fxc-error {{X3012: 'l_gro_uni_vol_con': missing initial value}} fxc-error {{X3047: 'l_gro_uni_vol_con': local variables cannot be declared 'uniform'}} */
-    groupshared uniform const float l_gro_uni_con;          /* expected-error {{'groupshared' is not a valid modifier for a local variable}} expected-error {{'uniform' is not a valid modifier for a local variable}} fxc-error {{X3010: 'l_gro_uni_con': local variables cannot be declared 'groupshared'}} fxc-error {{X3012: 'l_gro_uni_con': missing initial value}} fxc-error {{X3047: 'l_gro_uni_con': local variables cannot be declared 'uniform'}} */
+    groupshared uniform volatile const float l_gro_uni_vol_con;    /* expected-error {{'groupshared' is not a valid modifier for a local variable}} expected-error {{'uniform' is not a valid modifier for a local variable}} fxc-error {{X3010: 'l_gro_uni_vol_con': local variables cannot be declared 'groupshared'}} fxc-error {{X3047: 'l_gro_uni_vol_con': local variables cannot be declared 'uniform'}} */
+    groupshared uniform const float l_gro_uni_con;          /* expected-error {{'groupshared' is not a valid modifier for a local variable}} expected-error {{'uniform' is not a valid modifier for a local variable}} fxc-error {{X3010: 'l_gro_uni_con': local variables cannot be declared 'groupshared'}} fxc-error {{X3047: 'l_gro_uni_con': local variables cannot be declared 'uniform'}} */
     groupshared volatile float l_gro_vol;                   /* expected-error {{'groupshared' is not a valid modifier for a local variable}} fxc-error {{X3010: 'l_gro_vol': local variables cannot be declared 'groupshared'}} */
-    groupshared volatile const float l_gro_vol_con;         /* expected-error {{'groupshared' is not a valid modifier for a local variable}} fxc-error {{X3010: 'l_gro_vol_con': local variables cannot be declared 'groupshared'}} fxc-error {{X3012: 'l_gro_vol_con': missing initial value}} */
-    groupshared const float l_gro_con;                      /* expected-error {{'groupshared' is not a valid modifier for a local variable}} fxc-error {{X3010: 'l_gro_con': local variables cannot be declared 'groupshared'}} fxc-error {{X3012: 'l_gro_con': missing initial value}} */
+    groupshared volatile const float l_gro_vol_con;         /* expected-error {{'groupshared' is not a valid modifier for a local variable}} fxc-error {{X3010: 'l_gro_vol_con': local variables cannot be declared 'groupshared'}} */
+    groupshared const float l_gro_con;                      /* expected-error {{'groupshared' is not a valid modifier for a local variable}} fxc-error {{X3010: 'l_gro_con': local variables cannot be declared 'groupshared'}} */
     extern float l_ext;                                     /* expected-error {{'extern' is not a valid modifier for a local variable}} fxc-error {{X3006: 'l_ext': local variables cannot be declared 'extern'}} */
     extern precise float l_ext_pre;                         /* expected-error {{'extern' is not a valid modifier for a local variable}} fxc-error {{X3006: 'l_ext_pre': local variables cannot be declared 'extern'}} */
     extern precise uniform float l_ext_pre_uni;             /* expected-error {{'extern' is not a valid modifier for a local variable}} expected-error {{'uniform' is not a valid modifier for a local variable}} fxc-error {{X3006: 'l_ext_pre_uni': local variables cannot be declared 'extern'}} fxc-error {{X3047: 'l_ext_pre_uni': local variables cannot be declared 'uniform'}} */
     extern precise uniform volatile float l_ext_pre_uni_vol;    /* expected-error {{'extern' is not a valid modifier for a local variable}} expected-error {{'uniform' is not a valid modifier for a local variable}} fxc-error {{X3006: 'l_ext_pre_uni_vol': local variables cannot be declared 'extern'}} fxc-error {{X3047: 'l_ext_pre_uni_vol': local variables cannot be declared 'uniform'}} */
-    extern precise uniform volatile const float l_ext_pre_uni_vol_con;    /* expected-error {{'extern' is not a valid modifier for a local variable}} expected-error {{'uniform' is not a valid modifier for a local variable}} fxc-error {{X3006: 'l_ext_pre_uni_vol_con': local variables cannot be declared 'extern'}} fxc-error {{X3012: 'l_ext_pre_uni_vol_con': missing initial value}} fxc-error {{X3047: 'l_ext_pre_uni_vol_con': local variables cannot be declared 'uniform'}} */
-    extern precise uniform const float l_ext_pre_uni_con;   /* expected-error {{'extern' is not a valid modifier for a local variable}} expected-error {{'uniform' is not a valid modifier for a local variable}} fxc-error {{X3006: 'l_ext_pre_uni_con': local variables cannot be declared 'extern'}} fxc-error {{X3012: 'l_ext_pre_uni_con': missing initial value}} fxc-error {{X3047: 'l_ext_pre_uni_con': local variables cannot be declared 'uniform'}} */
+    extern precise uniform volatile const float l_ext_pre_uni_vol_con;    /* expected-error {{'extern' is not a valid modifier for a local variable}} expected-error {{'uniform' is not a valid modifier for a local variable}} fxc-error {{X3006: 'l_ext_pre_uni_vol_con': local variables cannot be declared 'extern'}} fxc-error {{X3047: 'l_ext_pre_uni_vol_con': local variables cannot be declared 'uniform'}} */
+    extern precise uniform const float l_ext_pre_uni_con;   /* expected-error {{'extern' is not a valid modifier for a local variable}} expected-error {{'uniform' is not a valid modifier for a local variable}} fxc-error {{X3006: 'l_ext_pre_uni_con': local variables cannot be declared 'extern'}} fxc-error {{X3047: 'l_ext_pre_uni_con': local variables cannot be declared 'uniform'}} */
     extern precise volatile float l_ext_pre_vol;            /* expected-error {{'extern' is not a valid modifier for a local variable}} fxc-error {{X3006: 'l_ext_pre_vol': local variables cannot be declared 'extern'}} */
-    extern precise volatile const float l_ext_pre_vol_con;  /* expected-error {{'extern' is not a valid modifier for a local variable}} fxc-error {{X3006: 'l_ext_pre_vol_con': local variables cannot be declared 'extern'}} fxc-error {{X3012: 'l_ext_pre_vol_con': missing initial value}} */
-    extern precise const float l_ext_pre_con;               /* expected-error {{'extern' is not a valid modifier for a local variable}} fxc-error {{X3006: 'l_ext_pre_con': local variables cannot be declared 'extern'}} fxc-error {{X3012: 'l_ext_pre_con': missing initial value}} */
+    extern precise volatile const float l_ext_pre_vol_con;  /* expected-error {{'extern' is not a valid modifier for a local variable}} fxc-error {{X3006: 'l_ext_pre_vol_con': local variables cannot be declared 'extern'}} */
+    extern precise const float l_ext_pre_con;               /* expected-error {{'extern' is not a valid modifier for a local variable}} fxc-error {{X3006: 'l_ext_pre_con': local variables cannot be declared 'extern'}} */
     extern uniform float l_ext_uni;                         /* expected-error {{'extern' is not a valid modifier for a local variable}} expected-error {{'uniform' is not a valid modifier for a local variable}} fxc-error {{X3006: 'l_ext_uni': local variables cannot be declared 'extern'}} fxc-error {{X3047: 'l_ext_uni': local variables cannot be declared 'uniform'}} */
     extern uniform volatile float l_ext_uni_vol;            /* expected-error {{'extern' is not a valid modifier for a local variable}} expected-error {{'uniform' is not a valid modifier for a local variable}} fxc-error {{X3006: 'l_ext_uni_vol': local variables cannot be declared 'extern'}} fxc-error {{X3047: 'l_ext_uni_vol': local variables cannot be declared 'uniform'}} */
-    extern uniform volatile const float l_ext_uni_vol_con;  /* expected-error {{'extern' is not a valid modifier for a local variable}} expected-error {{'uniform' is not a valid modifier for a local variable}} fxc-error {{X3006: 'l_ext_uni_vol_con': local variables cannot be declared 'extern'}} fxc-error {{X3012: 'l_ext_uni_vol_con': missing initial value}} fxc-error {{X3047: 'l_ext_uni_vol_con': local variables cannot be declared 'uniform'}} */
-    extern uniform const float l_ext_uni_con;               /* expected-error {{'extern' is not a valid modifier for a local variable}} expected-error {{'uniform' is not a valid modifier for a local variable}} fxc-error {{X3006: 'l_ext_uni_con': local variables cannot be declared 'extern'}} fxc-error {{X3012: 'l_ext_uni_con': missing initial value}} fxc-error {{X3047: 'l_ext_uni_con': local variables cannot be declared 'uniform'}} */
+    extern uniform volatile const float l_ext_uni_vol_con;  /* expected-error {{'extern' is not a valid modifier for a local variable}} expected-error {{'uniform' is not a valid modifier for a local variable}} fxc-error {{X3006: 'l_ext_uni_vol_con': local variables cannot be declared 'extern'}} fxc-error {{X3047: 'l_ext_uni_vol_con': local variables cannot be declared 'uniform'}} */
+    extern uniform const float l_ext_uni_con;               /* expected-error {{'extern' is not a valid modifier for a local variable}} expected-error {{'uniform' is not a valid modifier for a local variable}} fxc-error {{X3006: 'l_ext_uni_con': local variables cannot be declared 'extern'}} fxc-error {{X3047: 'l_ext_uni_con': local variables cannot be declared 'uniform'}} */
     extern volatile float l_ext_vol;                        /* expected-error {{'extern' is not a valid modifier for a local variable}} fxc-error {{X3006: 'l_ext_vol': local variables cannot be declared 'extern'}} */
-    extern volatile const float l_ext_vol_con;              /* expected-error {{'extern' is not a valid modifier for a local variable}} fxc-error {{X3006: 'l_ext_vol_con': local variables cannot be declared 'extern'}} fxc-error {{X3012: 'l_ext_vol_con': missing initial value}} */
-    extern const float l_ext_con;                           /* expected-error {{'extern' is not a valid modifier for a local variable}} fxc-error {{X3006: 'l_ext_con': local variables cannot be declared 'extern'}} fxc-error {{X3012: 'l_ext_con': missing initial value}} */
+    extern volatile const float l_ext_vol_con;              /* expected-error {{'extern' is not a valid modifier for a local variable}} fxc-error {{X3006: 'l_ext_vol_con': local variables cannot be declared 'extern'}} */
+    extern const float l_ext_con;                           /* expected-error {{'extern' is not a valid modifier for a local variable}} fxc-error {{X3006: 'l_ext_con': local variables cannot be declared 'extern'}} */
     precise float l_pre;
     precise static float l_pre_sta;
     precise static volatile float l_pre_sta_vol;
@@ -730,8 +801,8 @@ void vain() {
     precise static const float l_pre_sta_con;
     precise uniform float l_pre_uni;                        /* expected-error {{'uniform' is not a valid modifier for a local variable}} fxc-error {{X3047: 'l_pre_uni': local variables cannot be declared 'uniform'}} */
     precise uniform volatile float l_pre_uni_vol;           /* expected-error {{'uniform' is not a valid modifier for a local variable}} fxc-error {{X3047: 'l_pre_uni_vol': local variables cannot be declared 'uniform'}} */
-    precise uniform volatile const float l_pre_uni_vol_con; /* expected-error {{'uniform' is not a valid modifier for a local variable}} fxc-error {{X3012: 'l_pre_uni_vol_con': missing initial value}} fxc-error {{X3047: 'l_pre_uni_vol_con': local variables cannot be declared 'uniform'}} */
-    precise uniform const float l_pre_uni_con;              /* expected-error {{'uniform' is not a valid modifier for a local variable}} fxc-error {{X3012: 'l_pre_uni_con': missing initial value}} fxc-error {{X3047: 'l_pre_uni_con': local variables cannot be declared 'uniform'}} */
+    precise uniform volatile const float l_pre_uni_vol_con; /* expected-error {{'uniform' is not a valid modifier for a local variable}} fxc-error {{X3047: 'l_pre_uni_vol_con': local variables cannot be declared 'uniform'}} */
+    precise uniform const float l_pre_uni_con;              /* expected-error {{'uniform' is not a valid modifier for a local variable}} fxc-error {{X3047: 'l_pre_uni_con': local variables cannot be declared 'uniform'}} */
     precise volatile float l_pre_vol;
     precise volatile const float l_pre_vol_con;             /* fxc-error {{X3012: 'l_pre_vol_con': missing initial value}} */
     precise const float l_pre_con;                          /* fxc-error {{X3012: 'l_pre_con': missing initial value}} */
@@ -741,8 +812,8 @@ void vain() {
     static const float l_sta_con;
     uniform float l_uni;                                    /* expected-error {{'uniform' is not a valid modifier for a local variable}} fxc-error {{X3047: 'l_uni': local variables cannot be declared 'uniform'}} */
     uniform volatile float l_uni_vol;                       /* expected-error {{'uniform' is not a valid modifier for a local variable}} fxc-error {{X3047: 'l_uni_vol': local variables cannot be declared 'uniform'}} */
-    uniform volatile const float l_uni_vol_con;             /* expected-error {{'uniform' is not a valid modifier for a local variable}} fxc-error {{X3012: 'l_uni_vol_con': missing initial value}} fxc-error {{X3047: 'l_uni_vol_con': local variables cannot be declared 'uniform'}} */
-    uniform const float l_uni_con;                          /* expected-error {{'uniform' is not a valid modifier for a local variable}} fxc-error {{X3012: 'l_uni_con': missing initial value}} fxc-error {{X3047: 'l_uni_con': local variables cannot be declared 'uniform'}} */
+    uniform volatile const float l_uni_vol_con;             /* expected-error {{'uniform' is not a valid modifier for a local variable}} fxc-error {{X3047: 'l_uni_vol_con': local variables cannot be declared 'uniform'}} */
+    uniform const float l_uni_con;                          /* expected-error {{'uniform' is not a valid modifier for a local variable}} fxc-error {{X3047: 'l_uni_con': local variables cannot be declared 'uniform'}} */
     volatile float l_vol;
     volatile const float l_vol_con;                         /* fxc-error {{X3012: 'l_vol_con': missing initial value}} */
     const float l_con;                                      /* fxc-error {{X3012: 'l_con': missing initial value}} */
@@ -752,34 +823,34 @@ void vain() {
     // GENERATED_CODE:BEGIN
     groupshared precise static volatile const float l_gro_pre_sta_vol_con_init = 0.0;    /* expected-error {{'groupshared' is not a valid modifier for a local variable}} fxc-error {{X3010: 'l_gro_pre_sta_vol_con_init': local variables cannot be declared 'groupshared'}} */
     groupshared precise static const float l_gro_pre_sta_con_init = 0.0;    /* expected-error {{'groupshared' is not a valid modifier for a local variable}} fxc-error {{X3010: 'l_gro_pre_sta_con_init': local variables cannot be declared 'groupshared'}} */
-    groupshared precise uniform volatile const float l_gro_pre_uni_vol_con_init = 0.0;    /* expected-error {{'groupshared' is not a valid modifier for a local variable}} expected-error {{'uniform' is not a valid modifier for a local variable}} fxc-error {{X3010: 'l_gro_pre_uni_vol_con_init': local variables cannot be declared 'groupshared'}} fxc-error {{X3012: 'l_gro_pre_uni_vol_con_init': missing initial value}} fxc-error {{X3047: 'l_gro_pre_uni_vol_con_init': local variables cannot be declared 'uniform'}} */
-    groupshared precise uniform const float l_gro_pre_uni_con_init = 0.0;    /* expected-error {{'groupshared' is not a valid modifier for a local variable}} expected-error {{'uniform' is not a valid modifier for a local variable}} fxc-error {{X3010: 'l_gro_pre_uni_con_init': local variables cannot be declared 'groupshared'}} fxc-error {{X3012: 'l_gro_pre_uni_con_init': missing initial value}} fxc-error {{X3047: 'l_gro_pre_uni_con_init': local variables cannot be declared 'uniform'}} */
-    groupshared precise volatile const float l_gro_pre_vol_con_init = 0.0;   /* expected-error {{'groupshared' is not a valid modifier for a local variable}} fxc-error {{X3010: 'l_gro_pre_vol_con_init': local variables cannot be declared 'groupshared'}} fxc-error {{X3012: 'l_gro_pre_vol_con_init': missing initial value}} */
-    groupshared precise const float l_gro_pre_con_init = 0.0;    /* expected-error {{'groupshared' is not a valid modifier for a local variable}} fxc-error {{X3010: 'l_gro_pre_con_init': local variables cannot be declared 'groupshared'}} fxc-error {{X3012: 'l_gro_pre_con_init': missing initial value}} */
+    groupshared precise uniform volatile const float l_gro_pre_uni_vol_con_init = 0.0;    /* expected-error {{'groupshared' is not a valid modifier for a local variable}} expected-error {{'uniform' is not a valid modifier for a local variable}} fxc-error {{X3010: 'l_gro_pre_uni_vol_con_init': local variables cannot be declared 'groupshared'}} fxc-error {{X3047: 'l_gro_pre_uni_vol_con_init': local variables cannot be declared 'uniform'}} */
+    groupshared precise uniform const float l_gro_pre_uni_con_init = 0.0;    /* expected-error {{'groupshared' is not a valid modifier for a local variable}} expected-error {{'uniform' is not a valid modifier for a local variable}} fxc-error {{X3010: 'l_gro_pre_uni_con_init': local variables cannot be declared 'groupshared'}} fxc-error {{X3047: 'l_gro_pre_uni_con_init': local variables cannot be declared 'uniform'}} */
+    groupshared precise volatile const float l_gro_pre_vol_con_init = 0.0;   /* expected-error {{'groupshared' is not a valid modifier for a local variable}} fxc-error {{X3010: 'l_gro_pre_vol_con_init': local variables cannot be declared 'groupshared'}} */
+    groupshared precise const float l_gro_pre_con_init = 0.0;    /* expected-error {{'groupshared' is not a valid modifier for a local variable}} fxc-error {{X3010: 'l_gro_pre_con_init': local variables cannot be declared 'groupshared'}} */
     groupshared static volatile const float l_gro_sta_vol_con_init = 0.0;    /* expected-error {{'groupshared' is not a valid modifier for a local variable}} fxc-error {{X3010: 'l_gro_sta_vol_con_init': local variables cannot be declared 'groupshared'}} */
     groupshared static const float l_gro_sta_con_init = 0.0;    /* expected-error {{'groupshared' is not a valid modifier for a local variable}} fxc-error {{X3010: 'l_gro_sta_con_init': local variables cannot be declared 'groupshared'}} */
-    groupshared uniform volatile const float l_gro_uni_vol_con_init = 0.0;    /* expected-error {{'groupshared' is not a valid modifier for a local variable}} expected-error {{'uniform' is not a valid modifier for a local variable}} fxc-error {{X3010: 'l_gro_uni_vol_con_init': local variables cannot be declared 'groupshared'}} fxc-error {{X3012: 'l_gro_uni_vol_con_init': missing initial value}} fxc-error {{X3047: 'l_gro_uni_vol_con_init': local variables cannot be declared 'uniform'}} */
-    groupshared uniform const float l_gro_uni_con_init = 0.0;    /* expected-error {{'groupshared' is not a valid modifier for a local variable}} expected-error {{'uniform' is not a valid modifier for a local variable}} fxc-error {{X3010: 'l_gro_uni_con_init': local variables cannot be declared 'groupshared'}} fxc-error {{X3012: 'l_gro_uni_con_init': missing initial value}} fxc-error {{X3047: 'l_gro_uni_con_init': local variables cannot be declared 'uniform'}} */
-    groupshared volatile const float l_gro_vol_con_init = 0.0;   /* expected-error {{'groupshared' is not a valid modifier for a local variable}} fxc-error {{X3010: 'l_gro_vol_con_init': local variables cannot be declared 'groupshared'}} fxc-error {{X3012: 'l_gro_vol_con_init': missing initial value}} */
-    groupshared const float l_gro_con_init = 0.0;           /* expected-error {{'groupshared' is not a valid modifier for a local variable}} fxc-error {{X3010: 'l_gro_con_init': local variables cannot be declared 'groupshared'}} fxc-error {{X3012: 'l_gro_con_init': missing initial value}} */
-    extern precise uniform volatile const float l_ext_pre_uni_vol_con_init = 0.0;    /* expected-error {{'extern' is not a valid modifier for a local variable}} expected-error {{'uniform' is not a valid modifier for a local variable}} fxc-error {{X3006: 'l_ext_pre_uni_vol_con_init': local variables cannot be declared 'extern'}} fxc-error {{X3012: 'l_ext_pre_uni_vol_con_init': missing initial value}} fxc-error {{X3047: 'l_ext_pre_uni_vol_con_init': local variables cannot be declared 'uniform'}} */
-    extern precise uniform const float l_ext_pre_uni_con_init = 0.0;    /* expected-error {{'extern' is not a valid modifier for a local variable}} expected-error {{'uniform' is not a valid modifier for a local variable}} fxc-error {{X3006: 'l_ext_pre_uni_con_init': local variables cannot be declared 'extern'}} fxc-error {{X3012: 'l_ext_pre_uni_con_init': missing initial value}} fxc-error {{X3047: 'l_ext_pre_uni_con_init': local variables cannot be declared 'uniform'}} */
-    extern precise volatile const float l_ext_pre_vol_con_init = 0.0;   /* expected-error {{'extern' is not a valid modifier for a local variable}} fxc-error {{X3006: 'l_ext_pre_vol_con_init': local variables cannot be declared 'extern'}} fxc-error {{X3012: 'l_ext_pre_vol_con_init': missing initial value}} */
-    extern precise const float l_ext_pre_con_init = 0.0;    /* expected-error {{'extern' is not a valid modifier for a local variable}} fxc-error {{X3006: 'l_ext_pre_con_init': local variables cannot be declared 'extern'}} fxc-error {{X3012: 'l_ext_pre_con_init': missing initial value}} */
-    extern uniform volatile const float l_ext_uni_vol_con_init = 0.0;    /* expected-error {{'extern' is not a valid modifier for a local variable}} expected-error {{'uniform' is not a valid modifier for a local variable}} fxc-error {{X3006: 'l_ext_uni_vol_con_init': local variables cannot be declared 'extern'}} fxc-error {{X3012: 'l_ext_uni_vol_con_init': missing initial value}} fxc-error {{X3047: 'l_ext_uni_vol_con_init': local variables cannot be declared 'uniform'}} */
-    extern uniform const float l_ext_uni_con_init = 0.0;    /* expected-error {{'extern' is not a valid modifier for a local variable}} expected-error {{'uniform' is not a valid modifier for a local variable}} fxc-error {{X3006: 'l_ext_uni_con_init': local variables cannot be declared 'extern'}} fxc-error {{X3012: 'l_ext_uni_con_init': missing initial value}} fxc-error {{X3047: 'l_ext_uni_con_init': local variables cannot be declared 'uniform'}} */
-    extern volatile const float l_ext_vol_con_init = 0.0;   /* expected-error {{'extern' is not a valid modifier for a local variable}} fxc-error {{X3006: 'l_ext_vol_con_init': local variables cannot be declared 'extern'}} fxc-error {{X3012: 'l_ext_vol_con_init': missing initial value}} */
-    extern const float l_ext_con_init = 0.0;                /* expected-error {{'extern' is not a valid modifier for a local variable}} fxc-error {{X3006: 'l_ext_con_init': local variables cannot be declared 'extern'}} fxc-error {{X3012: 'l_ext_con_init': missing initial value}} */
+    groupshared uniform volatile const float l_gro_uni_vol_con_init = 0.0;    /* expected-error {{'groupshared' is not a valid modifier for a local variable}} expected-error {{'uniform' is not a valid modifier for a local variable}} fxc-error {{X3010: 'l_gro_uni_vol_con_init': local variables cannot be declared 'groupshared'}} fxc-error {{X3047: 'l_gro_uni_vol_con_init': local variables cannot be declared 'uniform'}} */
+    groupshared uniform const float l_gro_uni_con_init = 0.0;    /* expected-error {{'groupshared' is not a valid modifier for a local variable}} expected-error {{'uniform' is not a valid modifier for a local variable}} fxc-error {{X3010: 'l_gro_uni_con_init': local variables cannot be declared 'groupshared'}} fxc-error {{X3047: 'l_gro_uni_con_init': local variables cannot be declared 'uniform'}} */
+    groupshared volatile const float l_gro_vol_con_init = 0.0;   /* expected-error {{'groupshared' is not a valid modifier for a local variable}} fxc-error {{X3010: 'l_gro_vol_con_init': local variables cannot be declared 'groupshared'}} */
+    groupshared const float l_gro_con_init = 0.0;           /* expected-error {{'groupshared' is not a valid modifier for a local variable}} fxc-error {{X3010: 'l_gro_con_init': local variables cannot be declared 'groupshared'}} */
+    extern precise uniform volatile const float l_ext_pre_uni_vol_con_init = 0.0;    /* expected-error {{'extern' is not a valid modifier for a local variable}} expected-error {{'uniform' is not a valid modifier for a local variable}} fxc-error {{X3006: 'l_ext_pre_uni_vol_con_init': local variables cannot be declared 'extern'}} fxc-error {{X3047: 'l_ext_pre_uni_vol_con_init': local variables cannot be declared 'uniform'}} */
+    extern precise uniform const float l_ext_pre_uni_con_init = 0.0;    /* expected-error {{'extern' is not a valid modifier for a local variable}} expected-error {{'uniform' is not a valid modifier for a local variable}} fxc-error {{X3006: 'l_ext_pre_uni_con_init': local variables cannot be declared 'extern'}} fxc-error {{X3047: 'l_ext_pre_uni_con_init': local variables cannot be declared 'uniform'}} */
+    extern precise volatile const float l_ext_pre_vol_con_init = 0.0;   /* expected-error {{'extern' is not a valid modifier for a local variable}} fxc-error {{X3006: 'l_ext_pre_vol_con_init': local variables cannot be declared 'extern'}} */
+    extern precise const float l_ext_pre_con_init = 0.0;    /* expected-error {{'extern' is not a valid modifier for a local variable}} fxc-error {{X3006: 'l_ext_pre_con_init': local variables cannot be declared 'extern'}} */
+    extern uniform volatile const float l_ext_uni_vol_con_init = 0.0;    /* expected-error {{'extern' is not a valid modifier for a local variable}} expected-error {{'uniform' is not a valid modifier for a local variable}} fxc-error {{X3006: 'l_ext_uni_vol_con_init': local variables cannot be declared 'extern'}} fxc-error {{X3047: 'l_ext_uni_vol_con_init': local variables cannot be declared 'uniform'}} */
+    extern uniform const float l_ext_uni_con_init = 0.0;    /* expected-error {{'extern' is not a valid modifier for a local variable}} expected-error {{'uniform' is not a valid modifier for a local variable}} fxc-error {{X3006: 'l_ext_uni_con_init': local variables cannot be declared 'extern'}} fxc-error {{X3047: 'l_ext_uni_con_init': local variables cannot be declared 'uniform'}} */
+    extern volatile const float l_ext_vol_con_init = 0.0;   /* expected-error {{'extern' is not a valid modifier for a local variable}} fxc-error {{X3006: 'l_ext_vol_con_init': local variables cannot be declared 'extern'}} */
+    extern const float l_ext_con_init = 0.0;                /* expected-error {{'extern' is not a valid modifier for a local variable}} fxc-error {{X3006: 'l_ext_con_init': local variables cannot be declared 'extern'}} */
     precise static volatile const float l_pre_sta_vol_con_init = 0.0;
     precise static const float l_pre_sta_con_init = 0.0;
-    precise uniform volatile const float l_pre_uni_vol_con_init = 0.0;    /* expected-error {{'uniform' is not a valid modifier for a local variable}} fxc-error {{X3012: 'l_pre_uni_vol_con_init': missing initial value}} fxc-error {{X3047: 'l_pre_uni_vol_con_init': local variables cannot be declared 'uniform'}} */
-    precise uniform const float l_pre_uni_con_init = 0.0;   /* expected-error {{'uniform' is not a valid modifier for a local variable}} fxc-error {{X3012: 'l_pre_uni_con_init': missing initial value}} fxc-error {{X3047: 'l_pre_uni_con_init': local variables cannot be declared 'uniform'}} */
+    precise uniform volatile const float l_pre_uni_vol_con_init = 0.0;    /* expected-error {{'uniform' is not a valid modifier for a local variable}} fxc-error {{X3047: 'l_pre_uni_vol_con_init': local variables cannot be declared 'uniform'}} */
+    precise uniform const float l_pre_uni_con_init = 0.0;   /* expected-error {{'uniform' is not a valid modifier for a local variable}} fxc-error {{X3047: 'l_pre_uni_con_init': local variables cannot be declared 'uniform'}} */
     precise volatile const float l_pre_vol_con_init = 0.0;
     precise const float l_pre_con_init = 0.0;
     static volatile const float l_sta_vol_con_init = 0.0;
     static const float l_sta_con_init = 0.0;
-    uniform volatile const float l_uni_vol_con_init = 0.0;  /* expected-error {{'uniform' is not a valid modifier for a local variable}} fxc-error {{X3012: 'l_uni_vol_con_init': missing initial value}} fxc-error {{X3047: 'l_uni_vol_con_init': local variables cannot be declared 'uniform'}} */
-    uniform const float l_uni_con_init = 0.0;               /* expected-error {{'uniform' is not a valid modifier for a local variable}} fxc-error {{X3012: 'l_uni_con_init': missing initial value}} fxc-error {{X3047: 'l_uni_con_init': local variables cannot be declared 'uniform'}} */
+    uniform volatile const float l_uni_vol_con_init = 0.0;  /* expected-error {{'uniform' is not a valid modifier for a local variable}} fxc-error {{X3047: 'l_uni_vol_con_init': local variables cannot be declared 'uniform'}} */
+    uniform const float l_uni_con_init = 0.0;               /* expected-error {{'uniform' is not a valid modifier for a local variable}} fxc-error {{X3047: 'l_uni_con_init': local variables cannot be declared 'uniform'}} */
     volatile const float l_vol_con_init = 0.0;
     const float l_con_init = 0.0;
     // GENERATED_CODE:END
@@ -791,21 +862,38 @@ void vain() {
     nointerpolation sample float3 l_noi_sam;                /* expected-error {{'nointerpolation' and 'sample' cannot be used together for a local variable}} expected-error {{'nointerpolation' is not a valid modifier for a local variable}} expected-error {{'sample' is not a valid modifier for a local variable}} fxc-pass {{}} */
     nointerpolation noperspective float3 l_noi_nop;         /* expected-error {{'nointerpolation' and 'noperspective' cannot be used together for a local variable}} expected-error {{'nointerpolation' is not a valid modifier for a local variable}} expected-error {{'noperspective' is not a valid modifier for a local variable}} fxc-error {{X3048: constinterp usage cannot be used with linear, noperspective, or centroid usage}} */
     nointerpolation centroid float3 l_noi_cen;              /* expected-error {{'centroid' is not a valid modifier for a local variable}} expected-error {{'nointerpolation' and 'centroid' cannot be used together for a local variable}} expected-error {{'nointerpolation' is not a valid modifier for a local variable}} fxc-error {{X3048: constinterp usage cannot be used with linear, noperspective, or centroid usage}} */
+    nointerpolation center float3 l_noi_ctr;                /* expected-error {{'center' is not a valid modifier for a local variable}} expected-error {{'nointerpolation' and 'center' cannot be used together for a local variable}} expected-error {{'nointerpolation' is not a valid modifier for a local variable}} fxc-pass {{}} */
     linear float3 l_lin;                                    /* expected-error {{'linear' is not a valid modifier for a local variable}} fxc-pass {{}} */
     linear sample float3 l_lin_sam;                         /* expected-error {{'linear' is not a valid modifier for a local variable}} expected-error {{'sample' is not a valid modifier for a local variable}} fxc-pass {{}} */
     linear sample noperspective float3 l_lin_sam_nop;       /* expected-error {{'linear' is not a valid modifier for a local variable}} expected-error {{'noperspective' is not a valid modifier for a local variable}} expected-error {{'sample' is not a valid modifier for a local variable}} fxc-pass {{}} */
     linear sample noperspective centroid float3 l_lin_sam_nop_cen;    /* expected-error {{'centroid' is not a valid modifier for a local variable}} expected-error {{'linear' is not a valid modifier for a local variable}} expected-error {{'noperspective' is not a valid modifier for a local variable}} expected-error {{'sample' is not a valid modifier for a local variable}} expected-warning {{'centroid' will be overridden by 'sample'}} fxc-pass {{}} */
+    linear sample noperspective centroid center float3 l_lin_sam_nop_cen_ctr;    /* expected-error {{'center' is not a valid modifier for a local variable}} expected-error {{'centroid' is not a valid modifier for a local variable}} expected-error {{'linear' is not a valid modifier for a local variable}} expected-error {{'noperspective' is not a valid modifier for a local variable}} expected-error {{'sample' is not a valid modifier for a local variable}} expected-warning {{'center' will be overridden by 'centroid'}} expected-warning {{'center' will be overridden by 'sample'}} expected-warning {{'centroid' will be overridden by 'sample'}} fxc-pass {{}} */
+    linear sample noperspective center float3 l_lin_sam_nop_ctr;      /* expected-error {{'center' is not a valid modifier for a local variable}} expected-error {{'linear' is not a valid modifier for a local variable}} expected-error {{'noperspective' is not a valid modifier for a local variable}} expected-error {{'sample' is not a valid modifier for a local variable}} expected-warning {{'center' will be overridden by 'sample'}} fxc-pass {{}} */
     linear sample centroid float3 l_lin_sam_cen;            /* expected-error {{'centroid' is not a valid modifier for a local variable}} expected-error {{'linear' is not a valid modifier for a local variable}} expected-error {{'sample' is not a valid modifier for a local variable}} expected-warning {{'centroid' will be overridden by 'sample'}} fxc-pass {{}} */
+    linear sample centroid center float3 l_lin_sam_cen_ctr; /* expected-error {{'center' is not a valid modifier for a local variable}} expected-error {{'centroid' is not a valid modifier for a local variable}} expected-error {{'linear' is not a valid modifier for a local variable}} expected-error {{'sample' is not a valid modifier for a local variable}} expected-warning {{'center' will be overridden by 'centroid'}} expected-warning {{'center' will be overridden by 'sample'}} expected-warning {{'centroid' will be overridden by 'sample'}} fxc-pass {{}} */
+    linear sample center float3 l_lin_sam_ctr;              /* expected-error {{'center' is not a valid modifier for a local variable}} expected-error {{'linear' is not a valid modifier for a local variable}} expected-error {{'sample' is not a valid modifier for a local variable}} expected-warning {{'center' will be overridden by 'sample'}} fxc-pass {{}} */
     linear noperspective float3 l_lin_nop;                  /* expected-error {{'linear' is not a valid modifier for a local variable}} expected-error {{'noperspective' is not a valid modifier for a local variable}} fxc-pass {{}} */
     linear noperspective centroid float3 l_lin_nop_cen;     /* expected-error {{'centroid' is not a valid modifier for a local variable}} expected-error {{'linear' is not a valid modifier for a local variable}} expected-error {{'noperspective' is not a valid modifier for a local variable}} fxc-pass {{}} */
+    linear noperspective centroid center float3 l_lin_nop_cen_ctr;    /* expected-error {{'center' is not a valid modifier for a local variable}} expected-error {{'centroid' is not a valid modifier for a local variable}} expected-error {{'linear' is not a valid modifier for a local variable}} expected-error {{'noperspective' is not a valid modifier for a local variable}} expected-warning {{'center' will be overridden by 'centroid'}} fxc-pass {{}} */
+    linear noperspective center float3 l_lin_nop_ctr;       /* expected-error {{'center' is not a valid modifier for a local variable}} expected-error {{'linear' is not a valid modifier for a local variable}} expected-error {{'noperspective' is not a valid modifier for a local variable}} fxc-pass {{}} */
     linear centroid float3 l_lin_cen;                       /* expected-error {{'centroid' is not a valid modifier for a local variable}} expected-error {{'linear' is not a valid modifier for a local variable}} fxc-pass {{}} */
+    linear centroid center float3 l_lin_cen_ctr;            /* expected-error {{'center' is not a valid modifier for a local variable}} expected-error {{'centroid' is not a valid modifier for a local variable}} expected-error {{'linear' is not a valid modifier for a local variable}} expected-warning {{'center' will be overridden by 'centroid'}} fxc-pass {{}} */
+    linear center float3 l_lin_ctr;                         /* expected-error {{'center' is not a valid modifier for a local variable}} expected-error {{'linear' is not a valid modifier for a local variable}} fxc-pass {{}} */
     sample float3 l_sam;                                    /* expected-error {{'sample' is not a valid modifier for a local variable}} fxc-pass {{}} */
     sample noperspective float3 l_sam_nop;                  /* expected-error {{'noperspective' is not a valid modifier for a local variable}} expected-error {{'sample' is not a valid modifier for a local variable}} fxc-pass {{}} */
     sample noperspective centroid float3 l_sam_nop_cen;     /* expected-error {{'centroid' is not a valid modifier for a local variable}} expected-error {{'noperspective' is not a valid modifier for a local variable}} expected-error {{'sample' is not a valid modifier for a local variable}} expected-warning {{'centroid' will be overridden by 'sample'}} fxc-pass {{}} */
+    sample noperspective centroid center float3 l_sam_nop_cen_ctr;    /* expected-error {{'center' is not a valid modifier for a local variable}} expected-error {{'centroid' is not a valid modifier for a local variable}} expected-error {{'noperspective' is not a valid modifier for a local variable}} expected-error {{'sample' is not a valid modifier for a local variable}} expected-warning {{'center' will be overridden by 'centroid'}} expected-warning {{'center' will be overridden by 'sample'}} expected-warning {{'centroid' will be overridden by 'sample'}} fxc-pass {{}} */
+    sample noperspective center float3 l_sam_nop_ctr;       /* expected-error {{'center' is not a valid modifier for a local variable}} expected-error {{'noperspective' is not a valid modifier for a local variable}} expected-error {{'sample' is not a valid modifier for a local variable}} expected-warning {{'center' will be overridden by 'sample'}} fxc-pass {{}} */
     sample centroid float3 l_sam_cen;                       /* expected-error {{'centroid' is not a valid modifier for a local variable}} expected-error {{'sample' is not a valid modifier for a local variable}} expected-warning {{'centroid' will be overridden by 'sample'}} fxc-pass {{}} */
+    sample centroid center float3 l_sam_cen_ctr;            /* expected-error {{'center' is not a valid modifier for a local variable}} expected-error {{'centroid' is not a valid modifier for a local variable}} expected-error {{'sample' is not a valid modifier for a local variable}} expected-warning {{'center' will be overridden by 'centroid'}} expected-warning {{'center' will be overridden by 'sample'}} expected-warning {{'centroid' will be overridden by 'sample'}} fxc-pass {{}} */
+    sample center float3 l_sam_ctr;                         /* expected-error {{'center' is not a valid modifier for a local variable}} expected-error {{'sample' is not a valid modifier for a local variable}} expected-warning {{'center' will be overridden by 'sample'}} fxc-pass {{}} */
     noperspective float3 l_nop;                             /* expected-error {{'noperspective' is not a valid modifier for a local variable}} fxc-pass {{}} */
     noperspective centroid float3 l_nop_cen;                /* expected-error {{'centroid' is not a valid modifier for a local variable}} expected-error {{'noperspective' is not a valid modifier for a local variable}} fxc-pass {{}} */
+    noperspective centroid center float3 l_nop_cen_ctr;     /* expected-error {{'center' is not a valid modifier for a local variable}} expected-error {{'centroid' is not a valid modifier for a local variable}} expected-error {{'noperspective' is not a valid modifier for a local variable}} expected-warning {{'center' will be overridden by 'centroid'}} fxc-pass {{}} */
+    noperspective center float3 l_nop_ctr;                  /* expected-error {{'center' is not a valid modifier for a local variable}} expected-error {{'noperspective' is not a valid modifier for a local variable}} fxc-pass {{}} */
     centroid float3 l_cen;                                  /* expected-error {{'centroid' is not a valid modifier for a local variable}} fxc-pass {{}} */
+    centroid center float3 l_cen_ctr;                       /* expected-error {{'center' is not a valid modifier for a local variable}} expected-error {{'centroid' is not a valid modifier for a local variable}} expected-warning {{'center' will be overridden by 'centroid'}} fxc-pass {{}} */
+    center float3 l_ctr;                                    /* expected-error {{'center' is not a valid modifier for a local variable}} fxc-pass {{}} */
     // GENERATED_CODE:END
 
     nointerpolation precise shared groupshared float3 f8;   /* expected-error {{'groupshared' is not a valid modifier for a local variable}} expected-error {{'nointerpolation' is not a valid modifier for a local variable}} expected-error {{'shared' is not a valid modifier for a local variable}} fxc-error {{X3010: 'f8': local variables cannot be declared 'groupshared'}} fxc-error {{X3054: 'f8': local variables cannot be declared 'shared'}} */
@@ -903,21 +991,38 @@ nointerpolation linear float fn_noi_lin() { return 1.0f; }      /* expected-erro
 nointerpolation sample float fn_noi_sam() { return 1.0f; }      /* expected-error {{'nointerpolation' and 'sample' cannot be used together for a function}} fxc-pass {{}} */
 nointerpolation noperspective float fn_noi_nop() { return 1.0f; }    /* expected-error {{'nointerpolation' and 'noperspective' cannot be used together for a function}} fxc-error {{X3048: constinterp usage cannot be used with linear, noperspective, or centroid usage}} */
 nointerpolation centroid float fn_noi_cen() { return 1.0f; }    /* expected-error {{'nointerpolation' and 'centroid' cannot be used together for a function}} fxc-error {{X3048: constinterp usage cannot be used with linear, noperspective, or centroid usage}} */
+nointerpolation center float fn_noi_ctr() { return 1.0f; }      /* expected-error {{'nointerpolation' and 'center' cannot be used together for a function}} fxc-pass {{}} */
 linear float fn_lin() { return 1.0f; }
 linear sample float fn_lin_sam() { return 1.0f; }
 linear sample noperspective float fn_lin_sam_nop() { return 1.0f; }
 linear sample noperspective centroid float fn_lin_sam_nop_cen() { return 1.0f; }    /* expected-warning {{'centroid' will be overridden by 'sample'}} fxc-pass {{}} */
+linear sample noperspective centroid center float fn_lin_sam_nop_cen_ctr() { return 1.0f; }    /* expected-warning {{'center' will be overridden by 'centroid'}} expected-warning {{'center' will be overridden by 'sample'}} expected-warning {{'centroid' will be overridden by 'sample'}} fxc-pass {{}} */
+linear sample noperspective center float fn_lin_sam_nop_ctr() { return 1.0f; }      /* expected-warning {{'center' will be overridden by 'sample'}} fxc-pass {{}} */
 linear sample centroid float fn_lin_sam_cen() { return 1.0f; }  /* expected-warning {{'centroid' will be overridden by 'sample'}} fxc-pass {{}} */
+linear sample centroid center float fn_lin_sam_cen_ctr() { return 1.0f; }    /* expected-warning {{'center' will be overridden by 'centroid'}} expected-warning {{'center' will be overridden by 'sample'}} expected-warning {{'centroid' will be overridden by 'sample'}} fxc-pass {{}} */
+linear sample center float fn_lin_sam_ctr() { return 1.0f; }    /* expected-warning {{'center' will be overridden by 'sample'}} fxc-pass {{}} */
 linear noperspective float fn_lin_nop() { return 1.0f; }
 linear noperspective centroid float fn_lin_nop_cen() { return 1.0f; }
+linear noperspective centroid center float fn_lin_nop_cen_ctr() { return 1.0f; }    /* expected-warning {{'center' will be overridden by 'centroid'}} fxc-pass {{}} */
+linear noperspective center float fn_lin_nop_ctr() { return 1.0f; }
 linear centroid float fn_lin_cen() { return 1.0f; }
+linear centroid center float fn_lin_cen_ctr() { return 1.0f; }  /* expected-warning {{'center' will be overridden by 'centroid'}} fxc-pass {{}} */
+linear center float fn_lin_ctr() { return 1.0f; }
 sample float fn_sam() { return 1.0f; }
 sample noperspective float fn_sam_nop() { return 1.0f; }
 sample noperspective centroid float fn_sam_nop_cen() { return 1.0f; }    /* expected-warning {{'centroid' will be overridden by 'sample'}} fxc-pass {{}} */
+sample noperspective centroid center float fn_sam_nop_cen_ctr() { return 1.0f; }    /* expected-warning {{'center' will be overridden by 'centroid'}} expected-warning {{'center' will be overridden by 'sample'}} expected-warning {{'centroid' will be overridden by 'sample'}} fxc-pass {{}} */
+sample noperspective center float fn_sam_nop_ctr() { return 1.0f; }      /* expected-warning {{'center' will be overridden by 'sample'}} fxc-pass {{}} */
 sample centroid float fn_sam_cen() { return 1.0f; }             /* expected-warning {{'centroid' will be overridden by 'sample'}} fxc-pass {{}} */
+sample centroid center float fn_sam_cen_ctr() { return 1.0f; }  /* expected-warning {{'center' will be overridden by 'centroid'}} expected-warning {{'center' will be overridden by 'sample'}} expected-warning {{'centroid' will be overridden by 'sample'}} fxc-pass {{}} */
+sample center float fn_sam_ctr() { return 1.0f; }               /* expected-warning {{'center' will be overridden by 'sample'}} fxc-pass {{}} */
 noperspective float fn_nop() { return 1.0f; }
 noperspective centroid float fn_nop_cen() { return 1.0f; }
+noperspective centroid center float fn_nop_cen_ctr() { return 1.0f; }    /* expected-warning {{'center' will be overridden by 'centroid'}} fxc-pass {{}} */
+noperspective center float fn_nop_ctr() { return 1.0f; }
 centroid float fn_cen() { return 1.0f; }
+centroid center float fn_cen_ctr() { return 1.0f; }             /* expected-warning {{'center' will be overridden by 'centroid'}} fxc-pass {{}} */
+center float fn_ctr() { return 1.0f; }
 // GENERATED_CODE:END
 
 in float fn_in() { return 1.0f; }                           /* expected-error {{HLSL usage 'in' is only valid on a parameter}} fxc-error {{X3000: syntax error: unexpected token 'in'}} */
@@ -1005,21 +1110,38 @@ class C
     nointerpolation sample float fn_noi_sam() { return 1.0f; }    /* expected-error {{'nointerpolation' and 'sample' cannot be used together for a method}} expected-error {{'nointerpolation' is not a valid modifier for a method}} expected-error {{'sample' is not a valid modifier for a method}} fxc-pass {{}} */
     nointerpolation noperspective float fn_noi_nop() { return 1.0f; }    /* expected-error {{'nointerpolation' and 'noperspective' cannot be used together for a method}} expected-error {{'nointerpolation' is not a valid modifier for a method}} expected-error {{'noperspective' is not a valid modifier for a method}} fxc-error {{X3048: constinterp usage cannot be used with linear, noperspective, or centroid usage}} */
     nointerpolation centroid float fn_noi_cen() { return 1.0f; }    /* expected-error {{'centroid' is not a valid modifier for a method}} expected-error {{'nointerpolation' and 'centroid' cannot be used together for a method}} expected-error {{'nointerpolation' is not a valid modifier for a method}} fxc-error {{X3048: constinterp usage cannot be used with linear, noperspective, or centroid usage}} */
+    nointerpolation center float fn_noi_ctr() { return 1.0f; }      /* expected-error {{'center' is not a valid modifier for a method}} expected-error {{'nointerpolation' and 'center' cannot be used together for a method}} expected-error {{'nointerpolation' is not a valid modifier for a method}} fxc-pass {{}} */
     linear float fn_lin() { return 1.0f; }                  /* expected-error {{'linear' is not a valid modifier for a method}} fxc-pass {{}} */
     linear sample float fn_lin_sam() { return 1.0f; }       /* expected-error {{'linear' is not a valid modifier for a method}} expected-error {{'sample' is not a valid modifier for a method}} fxc-pass {{}} */
     linear sample noperspective float fn_lin_sam_nop() { return 1.0f; }    /* expected-error {{'linear' is not a valid modifier for a method}} expected-error {{'noperspective' is not a valid modifier for a method}} expected-error {{'sample' is not a valid modifier for a method}} fxc-pass {{}} */
     linear sample noperspective centroid float fn_lin_sam_nop_cen() { return 1.0f; }    /* expected-error {{'centroid' is not a valid modifier for a method}} expected-error {{'linear' is not a valid modifier for a method}} expected-error {{'noperspective' is not a valid modifier for a method}} expected-error {{'sample' is not a valid modifier for a method}} expected-warning {{'centroid' will be overridden by 'sample'}} fxc-pass {{}} */
+    linear sample noperspective centroid center float fn_lin_sam_nop_cen_ctr() { return 1.0f; }    /* expected-error {{'center' is not a valid modifier for a method}} expected-error {{'centroid' is not a valid modifier for a method}} expected-error {{'linear' is not a valid modifier for a method}} expected-error {{'noperspective' is not a valid modifier for a method}} expected-error {{'sample' is not a valid modifier for a method}} expected-warning {{'center' will be overridden by 'centroid'}} expected-warning {{'center' will be overridden by 'sample'}} expected-warning {{'centroid' will be overridden by 'sample'}} fxc-pass {{}} */
+    linear sample noperspective center float fn_lin_sam_nop_ctr() { return 1.0f; }      /* expected-error {{'center' is not a valid modifier for a method}} expected-error {{'linear' is not a valid modifier for a method}} expected-error {{'noperspective' is not a valid modifier for a method}} expected-error {{'sample' is not a valid modifier for a method}} expected-warning {{'center' will be overridden by 'sample'}} fxc-pass {{}} */
     linear sample centroid float fn_lin_sam_cen() { return 1.0f; }    /* expected-error {{'centroid' is not a valid modifier for a method}} expected-error {{'linear' is not a valid modifier for a method}} expected-error {{'sample' is not a valid modifier for a method}} expected-warning {{'centroid' will be overridden by 'sample'}} fxc-pass {{}} */
+    linear sample centroid center float fn_lin_sam_cen_ctr() { return 1.0f; }    /* expected-error {{'center' is not a valid modifier for a method}} expected-error {{'centroid' is not a valid modifier for a method}} expected-error {{'linear' is not a valid modifier for a method}} expected-error {{'sample' is not a valid modifier for a method}} expected-warning {{'center' will be overridden by 'centroid'}} expected-warning {{'center' will be overridden by 'sample'}} expected-warning {{'centroid' will be overridden by 'sample'}} fxc-pass {{}} */
+    linear sample center float fn_lin_sam_ctr() { return 1.0f; }      /* expected-error {{'center' is not a valid modifier for a method}} expected-error {{'linear' is not a valid modifier for a method}} expected-error {{'sample' is not a valid modifier for a method}} expected-warning {{'center' will be overridden by 'sample'}} fxc-pass {{}} */
     linear noperspective float fn_lin_nop() { return 1.0f; }    /* expected-error {{'linear' is not a valid modifier for a method}} expected-error {{'noperspective' is not a valid modifier for a method}} fxc-pass {{}} */
     linear noperspective centroid float fn_lin_nop_cen() { return 1.0f; }    /* expected-error {{'centroid' is not a valid modifier for a method}} expected-error {{'linear' is not a valid modifier for a method}} expected-error {{'noperspective' is not a valid modifier for a method}} fxc-pass {{}} */
+    linear noperspective centroid center float fn_lin_nop_cen_ctr() { return 1.0f; }    /* expected-error {{'center' is not a valid modifier for a method}} expected-error {{'centroid' is not a valid modifier for a method}} expected-error {{'linear' is not a valid modifier for a method}} expected-error {{'noperspective' is not a valid modifier for a method}} expected-warning {{'center' will be overridden by 'centroid'}} fxc-pass {{}} */
+    linear noperspective center float fn_lin_nop_ctr() { return 1.0f; }      /* expected-error {{'center' is not a valid modifier for a method}} expected-error {{'linear' is not a valid modifier for a method}} expected-error {{'noperspective' is not a valid modifier for a method}} fxc-pass {{}} */
     linear centroid float fn_lin_cen() { return 1.0f; }     /* expected-error {{'centroid' is not a valid modifier for a method}} expected-error {{'linear' is not a valid modifier for a method}} fxc-pass {{}} */
+    linear centroid center float fn_lin_cen_ctr() { return 1.0f; }    /* expected-error {{'center' is not a valid modifier for a method}} expected-error {{'centroid' is not a valid modifier for a method}} expected-error {{'linear' is not a valid modifier for a method}} expected-warning {{'center' will be overridden by 'centroid'}} fxc-pass {{}} */
+    linear center float fn_lin_ctr() { return 1.0f; }       /* expected-error {{'center' is not a valid modifier for a method}} expected-error {{'linear' is not a valid modifier for a method}} fxc-pass {{}} */
     sample float fn_sam() { return 1.0f; }                  /* expected-error {{'sample' is not a valid modifier for a method}} fxc-pass {{}} */
     sample noperspective float fn_sam_nop() { return 1.0f; }    /* expected-error {{'noperspective' is not a valid modifier for a method}} expected-error {{'sample' is not a valid modifier for a method}} fxc-pass {{}} */
     sample noperspective centroid float fn_sam_nop_cen() { return 1.0f; }    /* expected-error {{'centroid' is not a valid modifier for a method}} expected-error {{'noperspective' is not a valid modifier for a method}} expected-error {{'sample' is not a valid modifier for a method}} expected-warning {{'centroid' will be overridden by 'sample'}} fxc-pass {{}} */
+    sample noperspective centroid center float fn_sam_nop_cen_ctr() { return 1.0f; }    /* expected-error {{'center' is not a valid modifier for a method}} expected-error {{'centroid' is not a valid modifier for a method}} expected-error {{'noperspective' is not a valid modifier for a method}} expected-error {{'sample' is not a valid modifier for a method}} expected-warning {{'center' will be overridden by 'centroid'}} expected-warning {{'center' will be overridden by 'sample'}} expected-warning {{'centroid' will be overridden by 'sample'}} fxc-pass {{}} */
+    sample noperspective center float fn_sam_nop_ctr() { return 1.0f; }      /* expected-error {{'center' is not a valid modifier for a method}} expected-error {{'noperspective' is not a valid modifier for a method}} expected-error {{'sample' is not a valid modifier for a method}} expected-warning {{'center' will be overridden by 'sample'}} fxc-pass {{}} */
     sample centroid float fn_sam_cen() { return 1.0f; }     /* expected-error {{'centroid' is not a valid modifier for a method}} expected-error {{'sample' is not a valid modifier for a method}} expected-warning {{'centroid' will be overridden by 'sample'}} fxc-pass {{}} */
+    sample centroid center float fn_sam_cen_ctr() { return 1.0f; }    /* expected-error {{'center' is not a valid modifier for a method}} expected-error {{'centroid' is not a valid modifier for a method}} expected-error {{'sample' is not a valid modifier for a method}} expected-warning {{'center' will be overridden by 'centroid'}} expected-warning {{'center' will be overridden by 'sample'}} expected-warning {{'centroid' will be overridden by 'sample'}} fxc-pass {{}} */
+    sample center float fn_sam_ctr() { return 1.0f; }       /* expected-error {{'center' is not a valid modifier for a method}} expected-error {{'sample' is not a valid modifier for a method}} expected-warning {{'center' will be overridden by 'sample'}} fxc-pass {{}} */
     noperspective float fn_nop() { return 1.0f; }           /* expected-error {{'noperspective' is not a valid modifier for a method}} fxc-pass {{}} */
     noperspective centroid float fn_nop_cen() { return 1.0f; }    /* expected-error {{'centroid' is not a valid modifier for a method}} expected-error {{'noperspective' is not a valid modifier for a method}} fxc-pass {{}} */
+    noperspective centroid center float fn_nop_cen_ctr() { return 1.0f; }    /* expected-error {{'center' is not a valid modifier for a method}} expected-error {{'centroid' is not a valid modifier for a method}} expected-error {{'noperspective' is not a valid modifier for a method}} expected-warning {{'center' will be overridden by 'centroid'}} fxc-pass {{}} */
+    noperspective center float fn_nop_ctr() { return 1.0f; }      /* expected-error {{'center' is not a valid modifier for a method}} expected-error {{'noperspective' is not a valid modifier for a method}} fxc-pass {{}} */
     centroid float fn_cen() { return 1.0f; }                /* expected-error {{'centroid' is not a valid modifier for a method}} fxc-pass {{}} */
+    centroid center float fn_cen_ctr() { return 1.0f; }     /* expected-error {{'center' is not a valid modifier for a method}} expected-error {{'centroid' is not a valid modifier for a method}} expected-warning {{'center' will be overridden by 'centroid'}} fxc-pass {{}} */
+    center float fn_ctr() { return 1.0f; }                  /* expected-error {{'center' is not a valid modifier for a method}} fxc-pass {{}} */
     // GENERATED_CODE:END
 
     in float fn_in() { return 1.0f; }                       /* expected-error {{HLSL usage 'in' is only valid on a parameter}} fxc-error {{X3000: syntax error: unexpected token 'in'}} */