]> granicus.if.org Git - clang/commitdiff
Fix a minor edge case in C89 mode related to the definition of a
authorEli Friedman <eli.friedman@gmail.com>
Tue, 28 Apr 2009 17:59:09 +0000 (17:59 +0000)
committerEli Friedman <eli.friedman@gmail.com>
Tue, 28 Apr 2009 17:59:09 +0000 (17:59 +0000)
"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

lib/Sema/SemaExpr.cpp
test/Sema/c89.c
test/SemaCXX/member-pointer.cpp

index 045fa180e65c016f23ec2a2acfba499375389103..c4360a94a72521346a45897d6fb1972a39436715 100644 (file)
@@ -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();
index 3b1c7766fe564fb8e8fae8c1e897994e5e287f01..e7585c31926c3f42ede604c8d67a3ab93e7a2d25 100644 (file)
@@ -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)(); }
index 11993a1d4bd2d2d789ed9d77be87f491ae1391b6..1a663f6e1ccaaed555ead8547a64d9734ad17e1f 100644 (file)
@@ -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;