Commit 6916d610 by Ian Lance Taylor

compiler: remove "DIR/../" when joining relative import path

    
    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
parent 26fda5f5
be5fa26b2b1b5d0755bc1c7ce25f3aa26bea9d9c c0840d5826abb713487b2d8a04ab249764b21010
The first line of this file holds the git revision number of the last The first line of this file holds the git revision number of the last
merge done from the gofrontend repository. merge done from the gofrontend repository.
...@@ -82,6 +82,25 @@ Import::open_package(const std::string& filename, Location location, ...@@ -82,6 +82,25 @@ Import::open_package(const std::string& filename, Location location,
// A special case. // A special case.
fn = relative_import_path; 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 else
fn = relative_import_path + '/' + fn; fn = relative_import_path + '/' + fn;
is_local = false; is_local = false;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment