diff options
| author | Eli Friedman <eli.friedman@gmail.com> | 2009-04-28 17:59:09 +0000 |
|---|---|---|
| committer | Eli Friedman <eli.friedman@gmail.com> | 2009-04-28 17:59:09 +0000 |
| commit | 4058a842e6b69b5181c4e1d662a9bab386438255 (patch) | |
| tree | 88f984977f33741f485e3ae3dfcee07c95d80ed8 /clang | |
| parent | 9f1d66419d39b9f5e5109d107d503c2ce4202552 (diff) | |
| download | bcm5719-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.cpp | 2 | ||||
| -rw-r--r-- | clang/test/Sema/c89.c | 2 | ||||
| -rw-r--r-- | clang/test/SemaCXX/member-pointer.cpp | 2 |
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; |

