<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
  <meta content="text/html;charset=ISO-8859-1" http-equiv="Content-Type">
</head>
<body bgcolor="#ffffff" text="#000000">
Tanya Lattner wrote:
<blockquote cite="mid:0E6F5E33-6F53-40DB-9D9D-706A43F8EC21@apple.com"
 type="cite"><br>
  <div>
  <div>On Oct 6, 2009, at 3:50 PM, John McCall wrote:</div>
  <br class="Apple-interchange-newline">
  <blockquote type="cite">
    <div bgcolor="#ffffff" text="#000000">Tanya Lattner wrote:
    <blockquote
 cite="mid:8BC63CA3-0E0D-4F51-ACDC-E1C1205C063E@apple.com" type="cite"><br>
      <div>
      <div>On Oct 5, 2009, at 2:58 PM, Douglas Gregor wrote:</div>
      <br class="Apple-interchange-newline">
      <blockquote type="cite">
        <div style=""><br>
        <div>
        <div>On Oct 5, 2009, at 2:37 PM, Tanya Lattner wrote:</div>
        <br class="Apple-interchange-newline">
        <blockquote type="cite">
          <div style="">Hello,
          <div><br>
          </div>
          <div>I want to do a check on function parameters similar to
the "<span class="Apple-style-span"
 style="color: rgb(51, 89, 93); font-family: Menlo; font-size: 11px;">err_arg_with_address_space"
          </span><font class="Apple-style-span" size="3"><span
 class="Apple-style-span" style="font-size: 12px;">check that I added in</span></font><span
 class="Apple-style-span"
 style="color: rgb(51, 89, 93); font-family: Menlo; font-size: 11px;"> <span
 class="Apple-style-span" style="">ActOnParamDeclarator<span
 class="Apple-style-span"
 style="font-family: Helvetica; font-size: medium;"> (r83165)<span
 class="Apple-style-span" style="font-family: Menlo; font-size: 11px;">.
          <font class="Apple-style-span" face="Helvetica" size="3"><span
 class="Apple-style-span" style="font-size: 12px;">However, this time,
I only want to perform the check if the function has a specific
attribute. Is ActOnParamDeclarator the right place? I'm not seeing a
way to get the function attribute there. Or, any suggestion on where to
add this?</span></font></span></span></span></span></div>
          </div>
        </blockquote>
        </div>
        <div><br>
        </div>
ActOnParamDeclarator won't work, since that gets can get called by the
parser before we've seen the function attributes. I suggest putting
this check into ActOnFunctionDeclarator (e.g., where we check for
parameters of "void" type).
        <div><br>
        </div>
        </div>
      </blockquote>
      <div><br>
      </div>
      <div>Awesome, thanks! At this point in ActOnFunctionDeclarator,
do
parameters know about their attributes? Specifically addr space
qualifiers. I'm thinking no because it always seems to think the
param's in addr space 0, but when I dump the QualType I can clearly see
the addr space attribute and its non zero, but I assume it just hasn't
been processed yet.</div>
      </div>
    </blockquote>
    <br>
ActOnFunctionDeclarator doesn't get called until all the parameters
have finished parsing, so all the attributes, address spaces, etc.
should be present.<br>
    <br>
Can you post a code example where it thinks the parameter is in address
space 0 (I assume getAddressSpace() is returning 0)?<br>
    <br>
    </div>
  </blockquote>
  <div><br>
  </div>
  <div>Yes, I'm using getAddressSpace().</div>
  <div><br>
  </div>
  <div>Here is a simple example:</div>
  <div>__attribute__((annotate("random"))) void
foo(__attribute__((address_space(1))) int *x);</div>
  </div>
</blockquote>
<br>
I'm pretty sure this is legal in TR18037.  Like 'const', address spaces
can apply at any point in a type;  an address-space-qualified type says
that the object is stored in a particular address space.  So x is a
pointer (stored in the generic address space) to an object of type int
(stored in address space 1).<br>
<br>
The codegen implications of address spaces accrue to pointers into that
address space, which is why you can't have auto variables with direct
address space qualifications.<br>
<br>
If for some reason you want to implement a stricter condition than
TR18037 and forbid pointers into non-generic address spaces, you'll
need to pull off the outermost pointer from the type.<br>
<br>
John.
</body>
</html>