[cfe-dev] __uuidof() and declspec(uuid("...")) should be allowed on enumeration types

Puetz Kevin A via cfe-dev cfe-dev at lists.llvm.org
Thu Nov 17 14:51:07 PST 2016


Although not specifically mentioned in the documentation, MSVC accepts __uuidof(...) and declspec(uuid("...")) attributes on enumeration types in addition to structs/classes. This is meaningful, as such types *do* have associated UUIDs in ActiveX typelibs, and such attributes are included by default in the wrappers generated by their #import construct, so they are not particularly unusual.

clang currently rejects the declspec with a -Wignored-attributes warning, and errors on __uuidof() with "cannot call operator __uuidof on a type with no GUID" (because it rejected the uuid attribute, and therefore finds no value). This is causing problems for us while trying to use clang-tidy on a codebase that makes heavy use of ActiveX.

I believe I have found the relevant places to add this functionality, and attached are two patches adding this case to clang's implementation of these MS extensions. 
enum-uuidof-master.patch against r285994 (or actually the git mirror 80464680ce)
enum-uuidof-39.patch is the same, but based on release_39 at 282636. I don't seriously think this warrants a backport to 3.9, though I wouldn't object :-) However, I prepared the patch for our own use in the meantime, so I might as well include it. They differ only due to some reformatting of the error messages in include/clang/Basic/DiagnosticSemaKinds.td. 

Both include an update to test/Parser/MicrosoftExtensions.cpp to exercise the new functionality.

This is my first time contributing to LLVM, so if I've missed anything else needed to prepare this for review just let me know!

__uuidof: https://msdn.microsoft.com/en-us/library/zaah6a61.aspx
declspec(uuid("...")): https://msdn.microsoft.com/en-us/library/3b6wkewa.aspx
#import: https://msdn.microsoft.com/en-us/library/8etzzkb6.aspx
-------------- next part --------------
A non-text attachment was scrubbed...
Name: enum-uuidof-39.patch
Type: application/octet-stream
Size: 4319 bytes
Desc: enum-uuidof-39.patch
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20161117/e5893aac/attachment.obj>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: enum-uuidof-master.patch
Type: application/octet-stream
Size: 4263 bytes
Desc: enum-uuidof-master.patch
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20161117/e5893aac/attachment-0001.obj>


More information about the cfe-dev mailing list