os: handle long path in RemoveAll for windows

Fixes #36375

Change-Id: I407a1db23868880b83e73bc136d274659483fb69
Reviewed-on: https://go-review.googlesource.com/c/go/+/214437
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
diff --git a/src/os/removeall_noat.go b/src/os/removeall_noat.go
index c1b43e3..6474d2d 100644
--- a/src/os/removeall_noat.go
+++ b/src/os/removeall_noat.go
@@ -27,6 +27,7 @@
 	}
 
 	// Simple case: if Remove works, we're done.
+	path = fixLongPath(path)
 	err := Remove(path)
 	if err == nil || IsNotExist(err) {
 		return nil
diff --git a/src/os/removeall_test.go b/src/os/removeall_test.go
index 8a71f68..6fb31c2 100644
--- a/src/os/removeall_test.go
+++ b/src/os/removeall_test.go
@@ -206,6 +206,26 @@
 	}
 }
 
+func TestRemoveAllLongPathWindows(t *testing.T) {
+	startPath, err := ioutil.TempDir("", "TestRemoveAllLongPath-")
+	if err != nil {
+		t.Fatalf("Could not create TempDir: %s", err)
+	}
+	defer RemoveAll(startPath)
+
+	// Make a long path
+	err = MkdirAll(filepath.Join(startPath, "foo", "bar", strings.Repeat("a", 150),
+		strings.Repeat("b", 150)), ModePerm)
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	err = RemoveAll("foo")
+	if err != nil {
+		t.Fatal(err)
+	}
+}
+
 func TestRemoveAllDot(t *testing.T) {
 	prevDir, err := Getwd()
 	if err != nil {