summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
authorEli Friedman <eli.friedman@gmail.com>2009-04-28 17:59:09 +0000
committerEli Friedman <eli.friedman@gmail.com>2009-04-28 17:59:09 +0000
commit4058a842e6b69b5181c4e1d662a9bab386438255 (patch)
tree88f984977f33741f485e3ae3dfcee07c95d80ed8 /clang
parent9f1d66419d39b9f5e5109d107d503c2ce4202552 (diff)
downloadbcm5719-llvm-4058a842e6b69b5181c4e1d662a9bab386438255.tar.gz
bcm5719-llvm-4058a842e6b69b5181c4e1d662a9bab386438255.zip
Fix a minor edge case in C89 mode related to the definition of a
"function designator". (This causes a minor glitch in the diagnostics for C++ member pointers, but we weren't printing the right diagnostic there anyway.) llvm-svn: 70307
Diffstat (limited to 'clang')
-rw-r--r--clang/lib/Sema/SemaExpr.cpp2
-rw-r--r--clang/test/Sema/c89.c2
-rw-r--r--clang/test/SemaCXX/member-pointer.cpp2
3 files changed, 4 insertions, 2 deletions
diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp
index 045fa180e65..c4360a94a72 100644
--- a/clang/lib/Sema/SemaExpr.cpp
+++ b/clang/lib/Sema/SemaExpr.cpp
@@ -4095,7 +4095,7 @@ QualType Sema::CheckAddressOfOperand(Expr *op, SourceLocation OpLoc) {
if (lval != Expr::LV_Valid) { // C99 6.5.3.2p1
// The operand must be either an l-value or a function designator
- if (!dcl || !isa<FunctionDecl>(dcl)) {
+ if (!op->getType()->isFunctionType()) {
// FIXME: emit more specific diag...
Diag(OpLoc, diag::err_typecheck_invalid_lvalue_addrof)
<< op->getSourceRange();
diff --git a/clang/test/Sema/c89.c b/clang/test/Sema/c89.c
index 3b1c7766fe5..e7585c31926 100644
--- a/clang/test/Sema/c89.c
+++ b/clang/test/Sema/c89.c
@@ -78,3 +78,5 @@ void test13b() {
int b = 1[test13a().X]; /* expected-warning {{ISO C90 does not allow subscripting non-lvalue array}} */
}
+/* Make sure we allow *test14 as a "function designator" */
+int test14() { return (&*test14)(); }
diff --git a/clang/test/SemaCXX/member-pointer.cpp b/clang/test/SemaCXX/member-pointer.cpp
index 11993a1d4bd..1a663f6e1cc 100644
--- a/clang/test/SemaCXX/member-pointer.cpp
+++ b/clang/test/SemaCXX/member-pointer.cpp
@@ -71,7 +71,7 @@ void g() {
void (HasMembers::*pmf)() = &HasMembers::f;
void (*pnf)() = &Fake::f;
- &hm.f; // expected-error {{address expression must be an lvalue or a function designator}}
+ &hm.f; // FIXME: needs diagnostic expected-warning{{result unused}}
void (HasMembers::*pmgv)() = &HasMembers::g;
void (HasMembers::*pmgi)(int) = &HasMembers::g;
OpenPOWER on IntegriCloud