Skip to content
  • Reid Kleckner's avatar
    __uuidof() and declspec(uuid("...")) should be allowed on enumeration types · 14f4b9d4
    Reid Kleckner authored
    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,
    this patch adds this case to clang’s implementation of these MS
    extensions.  patch is against r285994 (or actually the git mirror
    80464680).
    
    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
    
    Reviewers: aaron.ballman, majnemer, rnk
    
    Differential Revision: https://reviews.llvm.org/D26846
    
    git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@289567 91177308-0d34-0410-b5e6-96231b3b80d8
    14f4b9d4