On Mar 28, 2013, at 10:57 AM, Alexander Zinenko <[email protected]> wrote:
> On 23 March 2013 01:22, Alexander Zinenko <[email protected]> wrote:
> Hi John, João!
> 
> This patch adds a diagnostic if the following declarations have illegal 
> calling conventions:
> * pointer to function, reference to function, pointer to member function 
> variable (or function attribute) declaration;
> * function declaration;
> * typedef declaration.
> 
> It was proposed in PR13457 discussion 
> (http://llvm.org/bugs/show_bug.cgi?id=13457#c22).
> 
> We already have such error for variadic functions declared with 
> CC_X86Fastcall that is emitted from SemaType.  But microsoft ABI has 
> different allowed CCs depending on whether it is a member function and it 
> can't be determined given FunctionType only (AFAIK, standard doesn't 
> differentiate between free function and member function types).  So this 
> checking has to be done on declarations.
> 
> With this patch, allowed calling conventions are ABI-specific. Therefore if 
> we teach affected ABIs to disallow fastcall on variadic functions, we can 
> remove the previous diagnostic.
> 
> Please review!
> 
> --
> Alex
> 
> <callconv.patch>

I would only pass a flag distinguishing non-static member functions vs. 
everything else.

+  if (T->isFunctionProtoType())
+    ProtoType = T->getAs<FunctionProtoType>();
+  else if (T->isFunctionPointerType())
+    ProtoType = T->getPointeeType()->getAs<FunctionProtoType>();
+  else if (T->isReferenceType()) {
+    QualType RefType = T->getAs<ReferenceType>()->getPointeeType();
+    ProtoType = RefType->getAs<FunctionProtoType>();
+  } else if (T->isMemberFunctionPointerType()) {
+    QualType PointerType = T->getAs<MemberPointerType>()->getPointeeType();

Test the result of getAs<>, please.

John.
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to