]> granicus.if.org Git - clang/commitdiff
[Windows] Fix __declspec(property) when the getter returns a ref
authorReid Kleckner <reid@kleckner.net>
Wed, 19 Jun 2013 16:37:23 +0000 (16:37 +0000)
committerReid Kleckner <reid@kleckner.net>
Wed, 19 Jun 2013 16:37:23 +0000 (16:37 +0000)
This fixes an issue when parsing atlbase.h.

Patch by Will Wilson!

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@184319 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaExpr.cpp
test/SemaCXX/MicrosoftExtensions.cpp

index edeb731b83df367ebbc01218c26b3c062af2ffdd..56ece247c6c54f1d3601cfe061edd30ff54bc4a3 100644 (file)
@@ -2003,7 +2003,8 @@ ExprResult Sema::ActOnIdExpression(Scope *S,
       MightBeImplicitMember = true;
     else
       MightBeImplicitMember = isa<FieldDecl>(R.getFoundDecl()) ||
-                              isa<IndirectFieldDecl>(R.getFoundDecl());
+                              isa<IndirectFieldDecl>(R.getFoundDecl()) ||
+                              isa<MSPropertyDecl>(R.getFoundDecl());
 
     if (MightBeImplicitMember)
       return BuildPossibleImplicitMemberExpr(SS, TemplateKWLoc,
index c0e7a5ad4c7a8c08a88db2af024ca6df4bf1a388..217fc6e6d7907d43dc5d83d951a76aaec1d84ca5 100644 (file)
@@ -344,3 +344,20 @@ union u {
   int *i1;
   int &i2;  // expected-warning {{union member 'i2' has reference type 'int &', which is a Microsoft extension}}
 };
+
+// Property getter using reference.
+struct SP11 {
+  __declspec(property(get=GetV)) int V;
+  int _v;
+  int& GetV() { return _v; }
+  void UseV();
+  void TakePtr(int *) {}
+  void TakeRef(int &) {}
+  void TakeVal(int) {}
+};
+
+void SP11::UseV() {
+  TakePtr(&V);
+  TakeRef(V);
+  TakeVal(V);
+}