From: Anders Carlsson Date: Sat, 16 May 2009 21:43:42 +0000 (+0000) Subject: Don't return member pointer types for static member functions. Fixes 6879261. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=196f7d0ce9d928ecf89430e099f6c065d72ef920;p=clang Don't return member pointer types for static member functions. Fixes 6879261. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@71961 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp index 6a0253823c..a31a96488a 100644 --- a/lib/Sema/SemaExpr.cpp +++ b/lib/Sema/SemaExpr.cpp @@ -4471,17 +4471,13 @@ QualType Sema::CheckAddressOfOperand(Expr *op, SourceLocation OpLoc) { return Context.getMemberPointerType(op->getType(), Context.getTypeDeclType(cast(Ctx)).getTypePtr()); } - } else if (isa(dcl)) { + } else if (CXXMethodDecl *MD = dyn_cast(dcl)) { // Okay: we can take the address of a function. // As above. - if (isa(op)) { - DeclContext *Ctx = dcl->getDeclContext(); - if (Ctx && Ctx->isRecord()) - return Context.getMemberPointerType(op->getType(), - Context.getTypeDeclType(cast(Ctx)).getTypePtr()); - } - } - else + if (isa(op) && MD->isInstance()) + return Context.getMemberPointerType(op->getType(), + Context.getTypeDeclType(MD->getParent()).getTypePtr()); + } else if (!isa(dcl)) assert(0 && "Unknown/unexpected decl type"); } diff --git a/test/SemaCXX/member-expr-static.cpp b/test/SemaCXX/member-expr-static.cpp new file mode 100644 index 0000000000..b6495a8520 --- /dev/null +++ b/test/SemaCXX/member-expr-static.cpp @@ -0,0 +1,21 @@ +// RUN: clang-cc -fsyntax-only -verify %s +typedef void (*thread_continue_t)(); + +extern "C" { +extern void kernel_thread_start(thread_continue_t continuation); +extern void pure_c(void); +} + +class _IOConfigThread +{ +public: + static void main( void ); +}; + + +void foo( void ) +{ + kernel_thread_start(&_IOConfigThread::main); + kernel_thread_start((thread_continue_t)&_IOConfigThread::main); + kernel_thread_start(&pure_c); +}