aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2008-11-21 18:27:34 +0000
committerChris Lattner <sabre@nondot.org>2008-11-21 18:27:34 +0000
commitb1b4d337fafe30823b581cbfaa1641f37541fffe (patch)
treedb8961041c46e00618325930da305283e87b9bf4
parent2ab1968eb400331ffe47c560583326e4034aed4a (diff)
print a type in a diagnostic.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@59829 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/clang/Basic/DiagnosticKinds.def2
-rw-r--r--lib/Sema/SemaExpr.cpp4
-rw-r--r--test/Sema/exprs.c4
3 files changed, 7 insertions, 3 deletions
diff --git a/include/clang/Basic/DiagnosticKinds.def b/include/clang/Basic/DiagnosticKinds.def
index bb681e6986..443e311462 100644
--- a/include/clang/Basic/DiagnosticKinds.def
+++ b/include/clang/Basic/DiagnosticKinds.def
@@ -1250,7 +1250,7 @@ DIAG(err_typecheck_duplicate_vector_components_not_mlvalue, ERROR,
DIAG(err_block_decl_ref_not_modifiable_lvalue, ERROR,
"variable is not assignable (missing __block type specifier)")
DIAG(err_typecheck_call_not_function, ERROR,
- "called object is not a function or function pointer")
+ "called object type '%0' is not a function or function pointer")
DIAG(err_typecheck_call_too_few_args, ERROR,
"too few arguments to function")
DIAG(err_typecheck_block_too_few_args, ERROR,
diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp
index ace5bcd5b7..7c4c15e0dd 100644
--- a/lib/Sema/SemaExpr.cpp
+++ b/lib/Sema/SemaExpr.cpp
@@ -1347,7 +1347,7 @@ ActOnCallExpr(ExprTy *fn, SourceLocation LParenLoc,
const PointerType *PT = Fn->getType()->getAsPointerType();
if (PT == 0)
return Diag(LParenLoc, diag::err_typecheck_call_not_function)
- << Fn->getSourceRange();
+ << Fn->getType().getAsString() << Fn->getSourceRange();
FuncT = PT->getPointeeType()->getAsFunctionType();
} else { // This is a block call.
FuncT = Fn->getType()->getAsBlockPointerType()->getPointeeType()->
@@ -1355,7 +1355,7 @@ ActOnCallExpr(ExprTy *fn, SourceLocation LParenLoc,
}
if (FuncT == 0)
return Diag(LParenLoc, diag::err_typecheck_call_not_function)
- << Fn->getSourceRange();
+ << Fn->getType().getAsString() << Fn->getSourceRange();
// We know the result type of the call, set it.
TheCall->setType(FuncT->getResultType().getNonReferenceType());
diff --git a/test/Sema/exprs.c b/test/Sema/exprs.c
index 8c8adc65b5..66806dba65 100644
--- a/test/Sema/exprs.c
+++ b/test/Sema/exprs.c
@@ -29,3 +29,7 @@ void test5(int *X, float *P) {
(float*)X = P; // expected-error {{assignment to cast is illegal, lvalue casts are not supported}}
}
+void test6() {
+ int X;
+ X(); // expected-error {{called object type 'int' is not a function or function pointer}}
+}