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:
Francois Pichet 2011-04-28 04:39:50 +00:00
parent 21735e608d
commit a1c1352a36
2 changed files with 16 additions and 0 deletions

View File

@ -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;

View File

@ -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: