mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-01-09 17:43:57 +00:00
Support &__uuidof(type) as a non type template argument.
This idiom is used everywhere in MFC/COM code and as such this patch removes hundreds of errors when parsing MFC code with clang. Example: template <class T, const GUID* g = &__uuidof(T)> class ComTemplate { }; typedef ComTemplate<struct_with_uuid, &__uuidof(struct_with_uuid)> COM_TYPE; Of course this is just parsing support. Trying to use this in CodeGen will generate: error: cannot yet mangle expression type CXXUuidofExpr llvm-svn: 130381
This commit is contained in:
parent
21735e608d
commit
a1c1352a36
@ -3093,6 +3093,15 @@ CheckTemplateArgumentAddressOfObjectOrFunction(Sema &S,
|
||||
bool AddressTaken = false;
|
||||
SourceLocation AddrOpLoc;
|
||||
if (UnaryOperator *UnOp = dyn_cast<UnaryOperator>(Arg)) {
|
||||
|
||||
// Support &__uuidof(class_with_uuid) as a non-type template argument.
|
||||
// Very common in Microsoft COM headers.
|
||||
if (S.getLangOptions().Microsoft &&
|
||||
isa<CXXUuidofExpr>(UnOp->getSubExpr())) {
|
||||
Converted = TemplateArgument(ArgIn);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (UnOp->getOpcode() == UO_AddrOf) {
|
||||
DRE = dyn_cast<DeclRefExpr>(UnOp->getSubExpr());
|
||||
AddressTaken = true;
|
||||
|
@ -95,6 +95,13 @@ void template_uuid()
|
||||
}
|
||||
|
||||
|
||||
template <class T, const GUID* g = &__uuidof(T)>
|
||||
class COM_CLASS_TEMPLATE { };
|
||||
|
||||
typedef COM_CLASS_TEMPLATE<struct_with_uuid, &__uuidof(struct_with_uuid)> COM_TYPE_1;
|
||||
typedef COM_CLASS_TEMPLATE<struct_with_uuid> COM_TYPE_2;
|
||||
|
||||
|
||||
|
||||
class CtorCall {
|
||||
public:
|
||||
|
Loading…
Reference in New Issue
Block a user