[cfe-commits] r85401 - in /cfe/trunk: lib/Sema/SemaExpr.cpp test/SemaCXX/ptrtomember-badcall.cpp
Fariborz Jahanian
fjahanian at apple.com
Wed Oct 28 09:49:47 PDT 2009
Author: fjahanian
Date: Wed Oct 28 11:49:46 2009
New Revision: 85401
URL: http://llvm.org/viewvc/llvm-project?rev=85401&view=rev
Log:
Diagnose use of data pointer member in a function call
expression instead of crashing.
Added:
cfe/trunk/test/SemaCXX/ptrtomember-badcall.cpp
Modified:
cfe/trunk/lib/Sema/SemaExpr.cpp
Modified: cfe/trunk/lib/Sema/SemaExpr.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=85401&r1=85400&r2=85401&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaExpr.cpp (original)
+++ cfe/trunk/lib/Sema/SemaExpr.cpp Wed Oct 28 11:49:46 2009
@@ -2860,24 +2860,29 @@
if (BinaryOperator *BO = dyn_cast<BinaryOperator>(Fn->IgnoreParens())) {
if (BO->getOpcode() == BinaryOperator::PtrMemD ||
BO->getOpcode() == BinaryOperator::PtrMemI) {
- const FunctionProtoType *FPT = cast<FunctionProtoType>(BO->getType());
- QualType ResultTy = FPT->getResultType().getNonReferenceType();
+ if (const FunctionProtoType *FPT =
+ dyn_cast<FunctionProtoType>(BO->getType())) {
+ QualType ResultTy = FPT->getResultType().getNonReferenceType();
- ExprOwningPtr<CXXMemberCallExpr>
- TheCall(this, new (Context) CXXMemberCallExpr(Context, BO, Args,
- NumArgs, ResultTy,
- RParenLoc));
+ ExprOwningPtr<CXXMemberCallExpr>
+ TheCall(this, new (Context) CXXMemberCallExpr(Context, BO, Args,
+ NumArgs, ResultTy,
+ RParenLoc));
- if (CheckCallReturnType(FPT->getResultType(),
- BO->getRHS()->getSourceRange().getBegin(),
- TheCall.get(), 0))
- return ExprError();
-
- if (ConvertArgumentsForCall(&*TheCall, BO, 0, FPT, Args, NumArgs,
- RParenLoc))
- return ExprError();
+ if (CheckCallReturnType(FPT->getResultType(),
+ BO->getRHS()->getSourceRange().getBegin(),
+ TheCall.get(), 0))
+ return ExprError();
+
+ if (ConvertArgumentsForCall(&*TheCall, BO, 0, FPT, Args, NumArgs,
+ RParenLoc))
+ return ExprError();
- return Owned(MaybeBindToTemporary(TheCall.release()).release());
+ return Owned(MaybeBindToTemporary(TheCall.release()).release());
+ }
+ return ExprError(Diag(Fn->getLocStart(),
+ diag::err_typecheck_call_not_function)
+ << Fn->getType() << Fn->getSourceRange());
}
}
}
Added: cfe/trunk/test/SemaCXX/ptrtomember-badcall.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/ptrtomember-badcall.cpp?rev=85401&view=auto
==============================================================================
--- cfe/trunk/test/SemaCXX/ptrtomember-badcall.cpp (added)
+++ cfe/trunk/test/SemaCXX/ptrtomember-badcall.cpp Wed Oct 28 11:49:46 2009
@@ -0,0 +1,13 @@
+// RUN: clang-cc -fsyntax-only -verify %s -std=c++0x
+
+struct S {
+ int i;
+
+ int mem(int);
+};
+
+int foo(int S::* ps, S *s)
+{
+ return (s->*ps)(1); // expected-error {{called object type 'int' is not a function or function pointer}}
+}
+
More information about the cfe-commits
mailing list