Fix PR clang/3175: CheckAddressOfOperand does not handle references to class vars

llvm-svn: 60849
This commit is contained in:
Douglas Gregor 2008-12-10 21:26:49 +00:00
parent 872ffce257
commit 9aa8b55d10
2 changed files with 35 additions and 1 deletions

View File

@ -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");
}

View File

@ -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}}
}