]> granicus.if.org Git - clang/commitdiff
clarify comment, this is undefined behavior in any case, even if it only
authorChris Lattner <sabre@nondot.org>
Mon, 25 Feb 2008 21:38:21 +0000 (21:38 +0000)
committerChris Lattner <sabre@nondot.org>
Mon, 25 Feb 2008 21:38:21 +0000 (21:38 +0000)
bits VC++ right now.

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

Lex/HeaderSearch.cpp

index 899c9d87a93d49fd53c777a7c9a049a720fad8e5..44ae35c8b7e4f82dff4f5d300fd67b4228f71bba 100644 (file)
@@ -228,22 +228,12 @@ const FileEntry *HeaderSearch::LookupFile(const char *FilenameStart,
     if (const FileEntry *FE = FileMgr.getFile(TmpDir.begin(), TmpDir.end())) {
       // Leave CurDir unset.
       // This file is a system header or C++ unfriendly if the old file is.
-      
-      // Note: Don't use:
       //
-      //  getFileInfo(FE).DirInfo = getFileInfo(CurFileEnt).DirInfo;
-      //
-      // MSVC, behind the scenes, does this:
-      //
-      //  PerFileInfo &pf1 = getFileInfo(CurFileEnt);
-      //  PerFileInfo &pf2 = getFileInfo(FE);
-      //  pf2.DirInfo = pf1.DirInfo
-      //
-      // The problem is that if there's a resize() of the FileInfo vector during
-      // the getFileInfo(FE) call, pf1 will point to invalid data.  To fix
-      // this problem, make the assignment through a temporary.
-      unsigned int tmp = getFileInfo(CurFileEnt).DirInfo;
-      getFileInfo(FE).DirInfo = tmp;
+      // Note that the temporary 'DirInfo' is required here, as either call to
+      // getFileInfo could resize the vector and we don't want to rely on order
+      // of evaluation.
+      unsigned DirInfo = getFileInfo(CurFileEnt).DirInfo;
+      getFileInfo(FE).DirInfo = DirInfo;
       return FE;
     }
   }
@@ -372,22 +362,12 @@ LookupSubframeworkHeader(const char *FilenameStart,
   }
   
   // This file is a system header or C++ unfriendly if the old file is.
-
-  // Note: Don't use:
-  //
-  //  getFileInfo(FE).DirInfo = getFileInfo(ContextFileEnt).DirInfo;
-  //
-  // MSVC, behind the scenes, does this:
-  //
-  //  PerFileInfo &pf1 = getFileInfo(ContextFileEnt);
-  //  PerFileInfo &pf2 = getFileInfo(FE);
-  //  pf2.DirInfo = pf1.DirInfo
   //
-  // The problem is that if there's a resize() of the FileInfo vector during
-  // the getFileInfo(FE) call, pf1 will point to invalid data.  The solution
-  // is to make the assignment through a temporary.
-  unsigned int tmp = getFileInfo(ContextFileEnt).DirInfo;
-  getFileInfo(FE).DirInfo = tmp;
+  // Note that the temporary 'DirInfo' is required here, as either call to
+  // getFileInfo could resize the vector and we don't want to rely on order
+  // of evaluation.
+  unsigned DirInfo = getFileInfo(ContextFileEnt).DirInfo;
+  getFileInfo(FE).DirInfo = DirInfo;
   return FE;
 }