diff options
| author | Anders Carlsson <andersca@mac.com> | 2011-05-06 14:25:31 +0000 |
|---|---|---|
| committer | Anders Carlsson <andersca@mac.com> | 2011-05-06 14:25:31 +0000 |
| commit | 47061ee5bc64f7621838ad954e6e887cd95d0721 (patch) | |
| tree | d336b48e430a8aa136841316cda7553913f7844b /clang/lib/Sema | |
| parent | 5fe4a7dc9619249a34388f7d25d2a4ac4dbcf5d9 (diff) | |
| download | bcm5719-llvm-47061ee5bc64f7621838ad954e6e887cd95d0721.tar.gz bcm5719-llvm-47061ee5bc64f7621838ad954e6e887cd95d0721.zip | |
Warn when trying to call a pure virtual member function in a class from the class constructor/destructor. Fixes PR7966.
llvm-svn: 130982
Diffstat (limited to 'clang/lib/Sema')
| -rw-r--r-- | clang/lib/Sema/SemaOverload.cpp | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/clang/lib/Sema/SemaOverload.cpp b/clang/lib/Sema/SemaOverload.cpp index 79caecc5a83..64f04de87aa 100644 --- a/clang/lib/Sema/SemaOverload.cpp +++ b/clang/lib/Sema/SemaOverload.cpp @@ -8781,6 +8781,19 @@ Sema::BuildCallToMemberFunction(Scope *S, Expr *MemExprE, if (CheckFunctionCall(Method, TheCall)) return ExprError(); + if ((isa<CXXConstructorDecl>(CurContext) || + isa<CXXDestructorDecl>(CurContext)) && + TheCall->getMethodDecl()->isPure()) { + const CXXMethodDecl *MD = TheCall->getMethodDecl(); + + if (isa<CXXThisExpr>(MemExpr->getBase()->IgnoreParenCasts())) + Diag(MemExpr->getLocStart(), + diag::warn_call_to_pure_virtual_member_function_from_ctor_dtor) + << MD->getDeclName() << isa<CXXDestructorDecl>(CurContext) + << MD->getParent()->getDeclName(); + + Diag(MD->getLocStart(), diag::note_previous_decl) << MD->getDeclName(); + } return MaybeBindToTemporary(TheCall); } |

