compiler: remove "DIR/../" when joining relative import path
authorIan Lance Taylor <ian@gcc.gnu.org>
Wed, 14 Jun 2017 13:37:48 +0000 (13:37 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Wed, 14 Jun 2017 13:37:48 +0000 (13:37 +0000)
    Otherwise if DIR does not exist, the path does not work. This matches
    what the gc cmd/compile tool does, because it calls path.Join.

    The test for this is the cmd/go tests, to be added in a follow-up CL.

    Reviewed-on: https://go-review.googlesource.com/45691

From-SVN: r249194

gcc/go/gofrontend/MERGE
gcc/go/gofrontend/import.cc

index 2d9adafbdd5882d3a5f9ca6f7db3c45853407a1b..4365d6e3b2ee45fef571a15a8853ad2ea40d848c 100644 (file)
@@ -1,4 +1,4 @@
-be5fa26b2b1b5d0755bc1c7ce25f3aa26bea9d9c
+c0840d5826abb713487b2d8a04ab249764b21010
 
 The first line of this file holds the git revision number of the last
 merge done from the gofrontend repository.
index f6b4e0c0566a346552662ec707334d5617628dd3..20b077f7f9985e6436cdada24df66986f18ac727 100644 (file)
@@ -82,6 +82,25 @@ Import::open_package(const std::string& filename, Location location,
          // A special case.
          fn = relative_import_path;
        }
+      else if (fn[0] == '.' && fn[1] == '.'
+              && (fn[2] == '\0' || IS_DIR_SEPARATOR(fn[2])))
+       {
+         // We are going to join relative_import_path and fn, and it
+         // will look like DIR/../PATH.  But DIR does not necessarily
+         // exist in this case, and if it doesn't the use of .. will
+         // fail although it shouldn't.  The gc compiler uses
+         // path.Join here, which cleans up the .., so we need to do
+         // the same.
+         size_t index;
+         for (index = relative_import_path.length() - 1;
+              index > 0 && !IS_DIR_SEPARATOR(relative_import_path[index]);
+              index--)
+           ;
+         if (index > 0)
+           fn = relative_import_path.substr(0, index) + fn.substr(2);
+         else
+           fn = relative_import_path + '/' + fn;
+       }
       else
        fn = relative_import_path + '/' + fn;
       is_local = false;