diff options
author | Douglas Gregor <dgregor@apple.com> | 2008-12-10 21:26:49 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2008-12-10 21:26:49 +0000 |
commit | 2988205cb3d00286fa3f32ae242f6738da9060d1 (patch) | |
tree | 767366072240f2aff76b9135b72edbae8c78af20 | |
parent | 83f96f668d0bcc957ead2032fe6e6c475dc156e5 (diff) |
Fix PR clang/3175: CheckAddressOfOperand does not handle references to class vars
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@60849 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Sema/SemaExpr.cpp | 5 | ||||
-rw-r--r-- | test/SemaCXX/address-of.cpp | 31 |
2 files changed, 35 insertions, 1 deletions
diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp index a36bcf5880..8cbbca3fbf 100644 --- a/lib/Sema/SemaExpr.cpp +++ b/lib/Sema/SemaExpr.cpp @@ -2876,8 +2876,11 @@ QualType Sema::CheckAddressOfOperand(Expr *op, SourceLocation OpLoc) { << "register variable" << op->getSourceRange(); return QualType(); } - } else if (isa<OverloadedFunctionDecl>(dcl)) + } else if (isa<OverloadedFunctionDecl>(dcl)) { return Context.OverloadTy; + } else if (isa<FieldDecl>(dcl)) { + // Okay: we can take the address of a field. + } else assert(0 && "Unknown/unexpected decl type"); } diff --git a/test/SemaCXX/address-of.cpp b/test/SemaCXX/address-of.cpp new file mode 100644 index 0000000000..5451f32688 --- /dev/null +++ b/test/SemaCXX/address-of.cpp @@ -0,0 +1,31 @@ +// RUN: clang -fsyntax-only -verify %S +// PR clang/3175 + +void bar(int*); + +class c { + int var; + static int svar; + void foo() { + bar(&var); + bar(&svar); + } + + static void wibble() { + bar(&var); // expected-error{{invalid use of member 'var' in static member function}} + bar(&svar); + } +}; + +enum E { + Enumerator +}; + +void test() { + (void)&Enumerator; // expected-error{{address expression must be an lvalue or a function designator}} +} + +template<int N> +void test2() { + (void)&N; // expected-error{{address expression must be an lvalue or a function designator}} +} |