From: Daniel Dunbar Date: Sat, 15 May 2010 00:00:37 +0000 (+0000) Subject: C++/ABI/x86_64: Member pointers should be classified as INTEGER. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=67d438d39a1cc37c372a2684dc354f58d0169bb1;p=clang C++/ABI/x86_64: Member pointers should be classified as INTEGER. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@103843 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/TargetInfo.cpp b/lib/CodeGen/TargetInfo.cpp index 176a7432b0..4a0a298c3b 100644 --- a/lib/CodeGen/TargetInfo.cpp +++ b/lib/CodeGen/TargetInfo.cpp @@ -853,6 +853,11 @@ void X86_64ABIInfo::classify(QualType Ty, classify(ET->getDecl()->getIntegerType(), Context, OffsetBase, Lo, Hi); } else if (Ty->hasPointerRepresentation()) { Current = Integer; + } else if (Ty->isMemberPointerType()) { + if (Ty->isMemberFunctionPointerType()) + Lo = Hi = Integer; + else + Current = Integer; } else if (const VectorType *VT = Ty->getAs()) { uint64_t Size = Context.getTypeSize(VT); if (Size == 32) { diff --git a/test/CodeGenCXX/x86_64-arguments.cpp b/test/CodeGenCXX/x86_64-arguments.cpp index 7ebbedc998..4bc83b8513 100644 --- a/test/CodeGenCXX/x86_64-arguments.cpp +++ b/test/CodeGenCXX/x86_64-arguments.cpp @@ -25,3 +25,11 @@ void f2(f2_s1 a0) { } struct s3_0 {}; struct s3_1 { struct s3_0 a; long b; }; void f3(struct s3_1 x) {} + +// CHECK: define i64 @_Z4f4_0M2s4i(i64) +// CHECK: define [[i64_i64_ty]] @_Z4f4_1M2s4FivE([[i64_i64_ty]]) +struct s4 {}; +typedef int s4::* s4_mdp; +typedef int (s4::*s4_mfp)(); +s4_mdp f4_0(s4_mdp a) { return a; } +s4_mfp f4_1(s4_mfp a) { return a; }