aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/clang/AST/Type.h7
-rw-r--r--lib/CodeGen/CGExprScalar.cpp5
-rw-r--r--test/CodeGenCXX/member-function-pointers.cpp11
3 files changed, 19 insertions, 4 deletions
diff --git a/include/clang/AST/Type.h b/include/clang/AST/Type.h
index f5a4a1ff92..754f1f74ff 100644
--- a/include/clang/AST/Type.h
+++ b/include/clang/AST/Type.h
@@ -897,6 +897,7 @@ public:
bool isFunctionPointerType() const;
bool isMemberPointerType() const;
bool isMemberFunctionPointerType() const;
+ bool isMemberDataPointerType() const;
bool isArrayType() const;
bool isConstantArrayType() const;
bool isIncompleteArrayType() const;
@@ -3486,6 +3487,12 @@ inline bool Type::isMemberFunctionPointerType() const {
else
return false;
}
+inline bool Type::isMemberDataPointerType() const {
+ if (const MemberPointerType* T = getAs<MemberPointerType>())
+ return !T->getPointeeType()->isFunctionType();
+ else
+ return false;
+}
inline bool Type::isArrayType() const {
return isa<ArrayType>(CanonicalType);
}
diff --git a/lib/CodeGen/CGExprScalar.cpp b/lib/CodeGen/CGExprScalar.cpp
index 38a49ee138..4d4ddd948c 100644
--- a/lib/CodeGen/CGExprScalar.cpp
+++ b/lib/CodeGen/CGExprScalar.cpp
@@ -569,12 +569,9 @@ EmitComplexToScalarConversion(CodeGenFunction::ComplexPairTy Src,
Value *ScalarExprEmitter::EmitNullValue(QualType Ty) {
const llvm::Type *LTy = ConvertType(Ty);
- if (!Ty->isMemberPointerType())
+ if (!Ty->isMemberDataPointerType())
return llvm::Constant::getNullValue(LTy);
- assert(!Ty->isMemberFunctionPointerType() &&
- "member function pointers are not scalar!");
-
// Itanium C++ ABI 2.3:
// A NULL pointer is represented as -1.
return llvm::ConstantInt::get(LTy, -1ULL, /*isSigned=*/true);
diff --git a/test/CodeGenCXX/member-function-pointers.cpp b/test/CodeGenCXX/member-function-pointers.cpp
index 0951174ca3..3e95f39a42 100644
--- a/test/CodeGenCXX/member-function-pointers.cpp
+++ b/test/CodeGenCXX/member-function-pointers.cpp
@@ -198,3 +198,14 @@ namespace test7 {
void (C::*ptr4)() = &B::vfoo;
void (C::*ptr5)() = &C::vfoo;
}
+
+namespace test8 {
+ struct X { };
+ typedef int (X::*pmf)(int);
+
+ // CHECK: {{define.*_ZN5test81fEv}}
+ pmf f() {
+ // CHECK: {{ret.*zeroinitializer}}
+ return pmf();
+ }
+}