From: Eli Friedman Date: Tue, 28 Apr 2009 17:59:09 +0000 (+0000) Subject: Fix a minor edge case in C89 mode related to the definition of a X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=9895d88c34cb2eab65c622cddeaf721108d1af38;p=clang 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.) git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@70307 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp index 045fa180e6..c4360a94a7 100644 --- a/lib/Sema/SemaExpr.cpp +++ b/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(dcl)) { + if (!op->getType()->isFunctionType()) { // FIXME: emit more specific diag... Diag(OpLoc, diag::err_typecheck_invalid_lvalue_addrof) << op->getSourceRange(); diff --git a/test/Sema/c89.c b/test/Sema/c89.c index 3b1c7766fe..e7585c3192 100644 --- a/test/Sema/c89.c +++ b/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/test/SemaCXX/member-pointer.cpp b/test/SemaCXX/member-pointer.cpp index 11993a1d4b..1a663f6e1c 100644 --- a/test/SemaCXX/member-pointer.cpp +++ b/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;