Track the source location of the dot or arrow operator in a MemberExpr.

Patch by Joe Ranieri!

llvm-svn: 233085
diff --git a/clang/lib/Frontend/Rewrite/RewriteModernObjC.cpp b/clang/lib/Frontend/Rewrite/RewriteModernObjC.cpp
index 47f8189..12c57cd 100644
--- a/clang/lib/Frontend/Rewrite/RewriteModernObjC.cpp
+++ b/clang/lib/Frontend/Rewrite/RewriteModernObjC.cpp
@@ -886,15 +886,15 @@
       FieldDecl *FD = FieldDecl::Create(*Context, nullptr, SourceLocation(),
                                         SourceLocation(),
                                         &Context->Idents.get(D->getNameAsString()),
-                                        IvarT, nullptr,
-                                        /*BitWidth=*/nullptr, /*Mutable=*/true,
-                                        ICIS_NoInit);
-      MemberExpr *ME = new (Context) MemberExpr(PE, true, FD, SourceLocation(),
-                                                FD->getType(), VK_LValue,
-                                                OK_Ordinary);
-      IvarT = Context->getDecltypeType(ME, ME->getType());
-    }
-  }
+                                        IvarT, nullptr,

+                                        /*BitWidth=*/nullptr, /*Mutable=*/true,

+                                        ICIS_NoInit);

+      MemberExpr *ME = new (Context)

+          MemberExpr(PE, true, SourceLocation(), FD, SourceLocation(),

+                     FD->getType(), VK_LValue, OK_Ordinary);

+      IvarT = Context->getDecltypeType(ME, ME->getType());

+    }

+  }

   convertObjCTypeToCStyleType(IvarT);
   QualType castT = Context->getPointerType(IvarT);
   std::string TypeString(castT.getAsString(Context->getPrintingPolicy()));
@@ -2764,17 +2764,15 @@
   FieldDecl *ARRFD = FieldDecl::Create(*Context, nullptr, SourceLocation(),
                                     SourceLocation(),
                                     &Context->Idents.get("arr"),
-                                    Context->getPointerType(Context->VoidPtrTy),
-                                    nullptr, /*BitWidth=*/nullptr,
-                                    /*Mutable=*/true, ICIS_NoInit);
-  MemberExpr *ArrayLiteralME = 
-    new (Context) MemberExpr(NSArrayCallExpr, false, ARRFD, 
-                             SourceLocation(),
-                             ARRFD->getType(), VK_LValue,
-                             OK_Ordinary);
-  QualType ConstIdT = Context->getObjCIdType().withConst();
-  CStyleCastExpr * ArrayLiteralObjects = 
-    NoTypeInfoCStyleCastExpr(Context, 
+                                    Context->getPointerType(Context->VoidPtrTy),

+                                    nullptr, /*BitWidth=*/nullptr,

+                                    /*Mutable=*/true, ICIS_NoInit);

+  MemberExpr *ArrayLiteralME = new (Context)

+      MemberExpr(NSArrayCallExpr, false, SourceLocation(), ARRFD,

+                 SourceLocation(), ARRFD->getType(), VK_LValue, OK_Ordinary);

+  QualType ConstIdT = Context->getObjCIdType().withConst();

+  CStyleCastExpr * ArrayLiteralObjects = 

+    NoTypeInfoCStyleCastExpr(Context, 

                              Context->getPointerType(ConstIdT),
                              CK_BitCast,
                              ArrayLiteralME);
@@ -2901,34 +2899,30 @@
   FieldDecl *ARRFD = FieldDecl::Create(*Context, nullptr, SourceLocation(),
                                        SourceLocation(),
                                        &Context->Idents.get("arr"),
-                                       Context->getPointerType(Context->VoidPtrTy),
-                                       nullptr, /*BitWidth=*/nullptr,
-                                       /*Mutable=*/true, ICIS_NoInit);
-  MemberExpr *DictLiteralValueME = 
-    new (Context) MemberExpr(NSValueCallExpr, false, ARRFD, 
-                             SourceLocation(),
-                             ARRFD->getType(), VK_LValue,
-                             OK_Ordinary);
-  QualType ConstIdT = Context->getObjCIdType().withConst();
-  CStyleCastExpr * DictValueObjects = 
-    NoTypeInfoCStyleCastExpr(Context, 
+                                       Context->getPointerType(Context->VoidPtrTy),

+                                       nullptr, /*BitWidth=*/nullptr,

+                                       /*Mutable=*/true, ICIS_NoInit);

+  MemberExpr *DictLiteralValueME = new (Context)

+      MemberExpr(NSValueCallExpr, false, SourceLocation(), ARRFD,

+                 SourceLocation(), ARRFD->getType(), VK_LValue, OK_Ordinary);

+  QualType ConstIdT = Context->getObjCIdType().withConst();

+  CStyleCastExpr * DictValueObjects = 

+    NoTypeInfoCStyleCastExpr(Context, 

                              Context->getPointerType(ConstIdT),
                              CK_BitCast,
                              DictLiteralValueME);
   // (const id <NSCopying> [])keys
-  Expr *NSKeyCallExpr = 
-    new (Context) CallExpr(*Context, NSDictDRE, KeyExprs,
-                           NSDictFType, VK_LValue, SourceLocation());
-  
-  MemberExpr *DictLiteralKeyME = 
-    new (Context) MemberExpr(NSKeyCallExpr, false, ARRFD, 
-                             SourceLocation(),
-                             ARRFD->getType(), VK_LValue,
-                             OK_Ordinary);
-  
-  CStyleCastExpr * DictKeyObjects = 
-    NoTypeInfoCStyleCastExpr(Context, 
-                             Context->getPointerType(ConstIdT),
+  Expr *NSKeyCallExpr = 

+    new (Context) CallExpr(*Context, NSDictDRE, KeyExprs,

+                           NSDictFType, VK_LValue, SourceLocation());

+

+  MemberExpr *DictLiteralKeyME = new (Context)

+      MemberExpr(NSKeyCallExpr, false, SourceLocation(), ARRFD,

+                 SourceLocation(), ARRFD->getType(), VK_LValue, OK_Ordinary);

+

+  CStyleCastExpr * DictKeyObjects = 

+    NoTypeInfoCStyleCastExpr(Context, 

+                             Context->getPointerType(ConstIdT),

                              CK_BitCast,
                              DictLiteralKeyME);
   
@@ -3231,15 +3225,15 @@
   FieldDecl *FieldD = FieldDecl::Create(*Context, nullptr, SourceLocation(),
                                     SourceLocation(),
                                     &Context->Idents.get("s"),
-                                    returnType, nullptr,
-                                    /*BitWidth=*/nullptr,
-                                    /*Mutable=*/true, ICIS_NoInit);
-  MemberExpr *ME = new (Context) MemberExpr(STCE, false, FieldD, SourceLocation(),
-                                            FieldD->getType(), VK_LValue,
-                                            OK_Ordinary);
-
-  return ME;
-}
+                                    returnType, nullptr,

+                                    /*BitWidth=*/nullptr,

+                                    /*Mutable=*/true, ICIS_NoInit);

+  MemberExpr *ME = new (Context)

+      MemberExpr(STCE, false, SourceLocation(), FieldD, SourceLocation(),

+                 FieldD->getType(), VK_LValue, OK_Ordinary);

+

+  return ME;

+}

 
 Stmt *RewriteModernObjC::SynthMessageExpr(ObjCMessageExpr *Exp,
                                     SourceLocation StartLoc,
@@ -4729,17 +4723,16 @@
   FieldDecl *FD = FieldDecl::Create(*Context, nullptr, SourceLocation(),
                                     SourceLocation(),
                                     &Context->Idents.get("FuncPtr"),
-                                    Context->VoidPtrTy, nullptr,
-                                    /*BitWidth=*/nullptr, /*Mutable=*/true,
-                                    ICIS_NoInit);
-  MemberExpr *ME = new (Context) MemberExpr(PE, true, FD, SourceLocation(),
-                                            FD->getType(), VK_LValue,
-                                            OK_Ordinary);
-
-  
-  CastExpr *FunkCast = NoTypeInfoCStyleCastExpr(Context, PtrToFuncCastType,
-                                                CK_BitCast, ME);
-  PE = new (Context) ParenExpr(SourceLocation(), SourceLocation(), FunkCast);
+                                    Context->VoidPtrTy, nullptr,

+                                    /*BitWidth=*/nullptr, /*Mutable=*/true,

+                                    ICIS_NoInit);

+  MemberExpr *ME =

+      new (Context) MemberExpr(PE, true, SourceLocation(), FD, SourceLocation(),

+                               FD->getType(), VK_LValue, OK_Ordinary);

+

+  CastExpr *FunkCast = NoTypeInfoCStyleCastExpr(Context, PtrToFuncCastType,

+                                                CK_BitCast, ME);

+  PE = new (Context) ParenExpr(SourceLocation(), SourceLocation(), FunkCast);

 
   SmallVector<Expr*, 8> BlkExprs;
   // Add the implicit argument.
@@ -4778,28 +4771,26 @@
   FieldDecl *FD = FieldDecl::Create(*Context, nullptr, SourceLocation(),
                                     SourceLocation(),
                                     &Context->Idents.get("__forwarding"), 
-                                    Context->VoidPtrTy, nullptr,
-                                    /*BitWidth=*/nullptr, /*Mutable=*/true,
-                                    ICIS_NoInit);
-  MemberExpr *ME = new (Context) MemberExpr(DeclRefExp, isArrow,
-                                            FD, SourceLocation(),
-                                            FD->getType(), VK_LValue,
-                                            OK_Ordinary);
-
-  StringRef Name = VD->getName();
-  FD = FieldDecl::Create(*Context, nullptr, SourceLocation(), SourceLocation(),
+                                    Context->VoidPtrTy, nullptr,

+                                    /*BitWidth=*/nullptr, /*Mutable=*/true,

+                                    ICIS_NoInit);

+  MemberExpr *ME = new (Context)

+      MemberExpr(DeclRefExp, isArrow, SourceLocation(), FD, SourceLocation(),

+                 FD->getType(), VK_LValue, OK_Ordinary);

+

+  StringRef Name = VD->getName();

+  FD = FieldDecl::Create(*Context, nullptr, SourceLocation(), SourceLocation(),

                          &Context->Idents.get(Name), 
-                         Context->VoidPtrTy, nullptr,
-                         /*BitWidth=*/nullptr, /*Mutable=*/true,
-                         ICIS_NoInit);
-  ME = new (Context) MemberExpr(ME, true, FD, SourceLocation(),
-                                DeclRefExp->getType(), VK_LValue, OK_Ordinary);
-  
-  
-  
-  // Need parens to enforce precedence.
-  ParenExpr *PE = new (Context) ParenExpr(DeclRefExp->getExprLoc(), 
-                                          DeclRefExp->getExprLoc(), 
+                         Context->VoidPtrTy, nullptr,

+                         /*BitWidth=*/nullptr, /*Mutable=*/true,

+                         ICIS_NoInit);

+  ME =

+      new (Context) MemberExpr(ME, true, SourceLocation(), FD, SourceLocation(),

+                               DeclRefExp->getType(), VK_LValue, OK_Ordinary);

+

+  // Need parens to enforce precedence.

+  ParenExpr *PE = new (Context) ParenExpr(DeclRefExp->getExprLoc(), 

+                                          DeclRefExp->getExprLoc(), 

                                           ME);
   ReplaceStmt(DeclRefExp, PE);
   return PE;
@@ -7691,15 +7682,15 @@
           FieldDecl *FD = FieldDecl::Create(*Context, nullptr, SourceLocation(),
                                             SourceLocation(),
                                             &Context->Idents.get(D->getNameAsString()),
-                                            IvarT, nullptr,
-                                            /*BitWidth=*/nullptr,
-                                            /*Mutable=*/true, ICIS_NoInit);
-          MemberExpr *ME = new (Context) MemberExpr(PE, true, FD, SourceLocation(),
-                                                    FD->getType(), VK_LValue,
-                                                    OK_Ordinary);
-          IvarT = Context->getDecltypeType(ME, ME->getType());
-        }
-      }
+                                            IvarT, nullptr,

+                                            /*BitWidth=*/nullptr,

+                                            /*Mutable=*/true, ICIS_NoInit);

+          MemberExpr *ME = new (Context)

+              MemberExpr(PE, true, SourceLocation(), FD, SourceLocation(),

+                         FD->getType(), VK_LValue, OK_Ordinary);

+          IvarT = Context->getDecltypeType(ME, ME->getType());

+        }

+      }

       convertObjCTypeToCStyleType(IvarT);
       QualType castT = Context->getPointerType(IvarT);
           
@@ -7720,15 +7711,15 @@
         FieldDecl *FD = FieldDecl::Create(*Context, nullptr, SourceLocation(),
                                           SourceLocation(),
                                           &Context->Idents.get(D->getNameAsString()),
-                                          D->getType(), nullptr,
-                                          /*BitWidth=*/D->getBitWidth(),
-                                          /*Mutable=*/true, ICIS_NoInit);
-        MemberExpr *ME = new (Context) MemberExpr(PE, /*isArrow*/false, FD, SourceLocation(),
-                                                  FD->getType(), VK_LValue,
-                                                  OK_Ordinary);
-        Replacement = ME;
-
-      }
+                                          D->getType(), nullptr,

+                                          /*BitWidth=*/D->getBitWidth(),

+                                          /*Mutable=*/true, ICIS_NoInit);

+        MemberExpr *ME = new (Context)

+            MemberExpr(PE, /*isArrow*/ false, SourceLocation(), FD,

+                       SourceLocation(), FD->getType(), VK_LValue, OK_Ordinary);

+        Replacement = ME;

+

+      }

       else
         Replacement = PE;
     }