aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNuno Lopes <nunoplopes@sapo.pt>2008-12-16 22:58:26 +0000
committerNuno Lopes <nunoplopes@sapo.pt>2008-12-16 22:58:26 +0000
commit6fea8d2e42a53a1c03e2e1ced68dda8a36e09153 (patch)
treef9efa1ee955aba86cfc4e348a39c88a9c6bc6855
parentf44515a49b549171dc3ee9faa6281b72609da563 (diff)
fix PR 3222: allow one to get the address of a global function in C++
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@61111 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Sema/SemaExpr.cpp6
-rw-r--r--test/SemaCXX/address-of.cpp6
2 files changed, 9 insertions, 3 deletions
diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp
index affe2ae240..cdaa2fc49c 100644
--- a/lib/Sema/SemaExpr.cpp
+++ b/lib/Sema/SemaExpr.cpp
@@ -2889,7 +2889,7 @@ QualType Sema::CheckAddressOfOperand(Expr *op, SourceLocation OpLoc) {
}
NamedDecl *dcl = getPrimaryDecl(op);
Expr::isLvalueResult lval = op->isLvalue(Context);
-
+ printf("oleee\n");
if (lval != Expr::LV_Valid) { // C99 6.5.3.2p1
if (!dcl || !isa<FunctionDecl>(dcl)) {// allow function designators
// FIXME: emit more specific diag...
@@ -2922,8 +2922,10 @@ QualType Sema::CheckAddressOfOperand(Expr *op, SourceLocation OpLoc) {
return Context.OverloadTy;
} else if (isa<FieldDecl>(dcl)) {
// Okay: we can take the address of a field.
+ } else if (isa<FunctionDecl>(dcl)) {
+ // Okay: we can take the address of a function.
}
- else
+ else
assert(0 && "Unknown/unexpected decl type");
}
diff --git a/test/SemaCXX/address-of.cpp b/test/SemaCXX/address-of.cpp
index 5451f32688..3d0e57f6e3 100644
--- a/test/SemaCXX/address-of.cpp
+++ b/test/SemaCXX/address-of.cpp
@@ -1,4 +1,4 @@
-// RUN: clang -fsyntax-only -verify %S
+// RUN: clang -fsyntax-only -verify %s
// PR clang/3175
void bar(int*);
@@ -29,3 +29,7 @@ template<int N>
void test2() {
(void)&N; // expected-error{{address expression must be an lvalue or a function designator}}
}
+
+// PR clang/3222
+void xpto();
+void (*xyz)(void) = &xpto;