[PATCH] Initial support for __sptr and __uptr

Aaron Ballman aaron at aaronballman.com
Thu May 16 07:12:46 PDT 2013


On Thu, May 16, 2013 at 12:46 AM, Richard Smith <richard at metafoo.co.uk> wrote:
> +++ lib/Sema/SemaDeclAttr.cpp (working copy)
> @@ -4225,7 +4225,7 @@
>      QualType BufferTy = getFunctionOrMethodArgType(D, ArgumentIdx);
>      if (!BufferTy->isPointerType()) {
>        S.Diag(Attr.getLoc(), diag::err_attribute_pointers_only)
> -        << AttrName;
> +        << Attr.getName();
>
> Did you mean to include this change?

I did -- I changed the error in the td file so that it didn't include
the quotes; by using the attribute identifier itself, the quotes are
automatically inserted.  This keeps the error consistent between
usages, but has no functional difference in terms of the output.

>
> +++ lib/Sema/SemaType.cpp (working copy)
> @@ -110,6 +110,13 @@
>      case AttributeList::AT_PnaclCall: \
>      case AttributeList::AT_IntelOclBicc \
>
> +// Microsoft-specific type qualifiers.
> +#define MS_TYPE_ATTRS_CASELIST  \
> +    case AttributeList::AT_Ptr32: \
> +    case AttributeList::AT_Ptr64: \
> +    case AttributeList::AT_SPtr: \
> +    case AttributeList::AT_UPtr \
> +
>
> Please remove the trailing \ from the end of this macro (and the previous
> existing one!)

Can do!

>
> +  // Pointer type qualifiers can only operate on pointer types, but not
> +  // pointer-to-member types.
> +  if (!Type->isPointerType() || Type->isMemberPointerType()) {
>
> Member pointer types are not pointer types, so you can drop the || ... part
> here.
>
> Also, what if there is type sugar before the pointer type? For instance:
>
> typedef int *T;
> T __ptr32 __sptr P; // ok?

This is illegal in VS (type qualifier must be after *)

> ... or ...
>
> int *(__ptr32 __sptr p); // ok?

As is this (same error)

> +  // You cannot have both __sptr and __uptr on the same declaration, nor
> can
> +  // you duplicate the attributes.
> +  const AttributedType *AT = dyn_cast<AttributedType>(Type);
>
> What if there is another AttributedType in between? For instance:
>
>   int * __sptr __ptr32 __sptr p; // presumably should be rejected,
> presumably won't be

This should be rejected according to the documentation (though it is
accepted by CL, but not Intellisense; I've already reported this via
Connect).

> You could address both of these by looping over AttributedTypes until you
> hit a PointerType, or by looking at the form of the pointer by inspecting
> the TypeProcessingState.
>
>
> Please add tests for these appearing at the start of the declaration, and
> after the identifier.

Will do.  Thanks!

~Aaron



More information about the cfe-commits mailing list