diff options
-rw-r--r-- | lib/Sema/SemaExpr.cpp | 6 | ||||
-rw-r--r-- | test/SemaCXX/address-of.cpp | 6 |
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; |