]> granicus.if.org Git - clang/commitdiff
Look through using declarations when searching for allocation overloads.
authorAnders Carlsson <andersca@mac.com>
Wed, 9 Dec 2009 07:39:44 +0000 (07:39 +0000)
committerAnders Carlsson <andersca@mac.com>
Wed, 9 Dec 2009 07:39:44 +0000 (07:39 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@90961 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaExprCXX.cpp
test/SemaCXX/new-delete.cpp

index f52f4c90c372717a1dfa4266a679e662227987f3..16c5275d7dedb42742c64f7f08558f8e6ccdfce2 100644 (file)
@@ -601,7 +601,8 @@ bool Sema::FindAllocationOverload(SourceLocation StartLoc, SourceRange Range,
        Alloc != AllocEnd; ++Alloc) {
     // Even member operator new/delete are implicitly treated as
     // static, so don't use AddMemberCandidate.
-    if (FunctionDecl *Fn = dyn_cast<FunctionDecl>(*Alloc)) {
+    if (FunctionDecl *Fn = 
+          dyn_cast<FunctionDecl>((*Alloc)->getUnderlyingDecl())) {
       AddOverloadCandidate(Fn, Args, NumArgs, Candidates,
                            /*SuppressUserConversions=*/false);
       continue;
index f2fe0a78e388ac772a2391ebbb609245d0c68ce8..dd28413855bd27b7dd4d65440e9f75fccc53d6fe 100644 (file)
@@ -202,3 +202,17 @@ struct X11 : X10 { // expected-error {{no suitable member 'operator delete' in '
 void f() {
   X11 x11; // expected-note {{implicit default destructor for 'struct X11' first required here}}
 }
+
+struct X12 {
+  void* operator new(size_t, void*);
+};
+
+struct X13 : X12 {
+  using X12::operator new;
+};
+
+static void* f(void* g)
+{
+    return new (g) X13();
+}
+