MS extensions: Properly diagnose address of MS property decl

Summary: Fixes PR22671.

Reviewers: rsmith

Subscribers: cfe-commits

Differential Revision: http://reviews.llvm.org/D7863

llvm-svn: 230362
This commit is contained in:
Reid Kleckner 2015-02-24 20:29:40 +00:00
parent 96cf7abf4d
commit 85c7e0a3f3
3 changed files with 18 additions and 3 deletions

View File

@ -418,9 +418,10 @@ static Cl::Kinds ClassifyDecl(ASTContext &Ctx, const Decl *D) {
islvalue = NTTParm->getType()->isReferenceType();
else
islvalue = isa<VarDecl>(D) || isa<FieldDecl>(D) ||
isa<IndirectFieldDecl>(D) ||
(Ctx.getLangOpts().CPlusPlus &&
(isa<FunctionDecl>(D) || isa<FunctionTemplateDecl>(D)));
isa<IndirectFieldDecl>(D) ||
(Ctx.getLangOpts().CPlusPlus &&
(isa<FunctionDecl>(D) || isa<MSPropertyDecl>(D) ||
isa<FunctionTemplateDecl>(D)));
return islvalue ? Cl::CL_LValue : Cl::CL_PRValue;
}

View File

@ -9352,6 +9352,8 @@ QualType Sema::CheckAddressOfOperand(ExprResult &OrigOp, SourceLocation OpLoc) {
!getLangOpts().CPlusPlus) {
AddressOfError = AO_Register_Variable;
}
} else if (isa<MSPropertyDecl>(dcl)) {
AddressOfError = AO_Property_Expansion;
} else if (isa<FunctionTemplateDecl>(dcl)) {
return Context.OverloadTy;
} else if (isa<FieldDecl>(dcl) || isa<IndirectFieldDecl>(dcl)) {

View File

@ -344,6 +344,18 @@ struct StructWithUnnamedMember {
__declspec(property(get=GetV)) int : 10; // expected-error {{anonymous property is not supported}}
};
struct MSPropertyClass {
int get() { return 42; }
int __declspec(property(get = get)) n;
};
int *f(MSPropertyClass &x) {
return &x.n; // expected-error {{address of property expression requested}}
}
int MSPropertyClass::*g() {
return &MSPropertyClass::n; // expected-error {{address of property expression requested}}
}
namespace rdar14250378 {
class Bar {};