<div dir="ltr">Our architecture has a somewhat different memory model with three different address spaces: local, block, global.<br><div><div><br>Some time ago (prior to my involvement in our project) our address space extensions were added to the frontend so that we can write:<br><br>volatile  int v_i;<br>xstglocal int l_i;<br>xstgblock int b_i;<br>xstgglobal int g_i;<br><br>volatile  int* p_vi;      // Regular pointer to volatile integer<br>xstglocal int* p_li;      // Regular pointer to local integer <br>xstgblock int* b_pi;      // Regular pointer to block integer <br>xstgglobal int* g_pi;      // Regular pointer to global integer<br><br>int* volatile  vp_i;      // Volatile pointer to regular integer<br><br></div><div>These address space modifiers (xstglocal, xstgblock, xstgglobal) are used to determine which address space data is stored in. The above will compile just fine.<br><br></div><div>However, originally this work was done for clang/llvm 3.2. After we moved to 3.6 we found that the following (which used to work in 3.2) no longer works in 3.6:<br><br>int* xstglocal lp_i;      // Local pointer to any integer<br>int* xstgblock b_pi;      // Block pointer to any integer<br>int* xstgglobal g_pi;      // Global pointer to any integer<br><br>xstgglobal int* xstglocal vp_li;  // Local pointer to global integer<br>xstglocal int* xstgblock vp_bi;  // Block pointer to local integer<br>xstgblock int* xstgglobal vp_gi;  // Global pointer to block integer<br><br></div><div>These result in front end errors:<br><br>issue.c:13:7: error: expected identifier or '('<br>int * xstglocal lp_i;      // Local pointer to any integer<br>     ^<br>issue.c:14:7: error: expected identifier or '('<br>int * xstgblock b_pi;      // Block pointer to any integer<br>     ^<br>issue.c:15:7: error: expected identifier or '('<br>int * xstgglobal g_pi;      // Global pointer to any integer<br>     ^<br>issue.c:20:18: error: expected identifier or '('<br>xstgglobal int * xstglocal vp_li;  // Local pointer to global integer<br>                ^<br>issue.c:21:18: error: expected identifier or '('<br>xstglocal int * xstgblock vp_bi;  // Block pointer to local integer<br>                ^<br>issue.c:22:18: error: expected identifier or '('<br>xstgblock int * xstgglobal vp_gi;  // Global pointer to block integer<br>                ^<br>6 errors generated.<br><br></div><div>It looks as though these address space extension keywords were added in <br></div><div>TokenKinds.def:<br>// XSTG address space qualifiers<br>KEYWORD(xstgglobal                 , KEYXSTG)<br>KEYWORD(xstgblock                  , KEYXSTG)<br>KEYWORD(xstglocal                  , KEYXSTG)<br><br></div><div>As well as in Attr.td:<br><br>def XSTGLocalAddressSpace : TypeAttr {<br> let Spellings = [Keyword<"xstglocal">];<br> let Documentation = [Undocumented];<br>}<br><br>def XSTGBlockAddressSpace : TypeAttr {<br> let Spellings = [Keyword<"xstgblock">];<br> let Documentation = [Undocumented];<br>}<br><br>def XSTGGlobalAddressSpace : TypeAttr {<br> let Spellings = [Keyword<"xstgglobal">];<br> let Documentation = [Undocumented];<br>}<br><br></div><div>with some support in ParseDecl.cpp.<br><br></div><div>Was there an API change between clang 3.2 and 3.6 that might have broken this? Any pointers on how I might fix these errors?<br><br></div><div>Thanks.<br><br></div><div>Phil<br></div><div><br><br></div><div><br></div></div></div>