get_filename_component: Restore lexical preprocessing of REALPATH for compat

Revert commit c554437733 (get_filename_component: Fix REALPATH for ..
after symlink, 2024-11-21, v4.0.0-rc1~411^2) because it changed existing
behavior without a policy.  Also add a test case for the old behavior.

Note that we have policy `CMP0152` to fix this for `file(REAL_PATH)`,
but it does not affect `get_filename_component(... REALPATH)`.  A new
policy would be needed for the latter.

Fixes: #26815
Issue: #26472
diff --git a/Source/cmGetFilenameComponentCommand.cxx b/Source/cmGetFilenameComponentCommand.cxx
index 1543ca6..dee5c3f 100644
--- a/Source/cmGetFilenameComponentCommand.cxx
+++ b/Source/cmGetFilenameComponentCommand.cxx
@@ -107,15 +107,9 @@
         }
       }
     }
-    if (args[2] == "ABSOLUTE") {
-      // Collapse the path to its simplest form.
-      result = cmSystemTools::CollapseFullPath(filename, baseDir);
-    } else {
-      // Convert relative paths to absolute paths
-      result = filename;
-      if (!cmSystemTools::FileIsFullPath(result)) {
-        result = cmStrCat(baseDir, '/', result);
-      }
+    // Collapse the path to its simplest form.
+    result = cmSystemTools::CollapseFullPath(filename, baseDir);
+    if (args[2] == "REALPATH") {
       // Resolve symlinks if possible
       result = cmSystemTools::GetRealPath(result);
     }
diff --git a/Tests/CMakeTests/GetFilenameComponentRealpathTest.cmake.in b/Tests/CMakeTests/GetFilenameComponentRealpathTest.cmake.in
index 22f6afd..4701fab 100644
--- a/Tests/CMakeTests/GetFilenameComponentRealpathTest.cmake.in
+++ b/Tests/CMakeTests/GetFilenameComponentRealpathTest.cmake.in
@@ -13,6 +13,22 @@
 endif()
 
 #
+# Test treatment of .. after file name
+#
+foreach(c REALPATH ABSOLUTE)
+  get_filename_component(dir "${CMAKE_CURRENT_LIST_DIR}" ${c})
+  get_filename_component(fileDotDot "${CMAKE_CURRENT_LIST_FILE}/.." ${c})
+  if(NOT "${fileDotDot}" STREQUAL "${dir}")
+    message(FATAL_ERROR
+      "${c} did not resolve\n"
+      "  ${CMAKE_CURRENT_LIST_FILE}/..\n"
+      "lexically:\n"
+      "  ${fileDotDot}"
+    )
+  endif()
+endforeach()
+
+#
 # Test treatment of relative paths
 #
 foreach(c REALPATH ABSOLUTE)
diff --git a/Tests/RunCMake/get_filename_component/KnownComponents.cmake b/Tests/RunCMake/get_filename_component/KnownComponents.cmake
index 93f9270..34af12e 100644
--- a/Tests/RunCMake/get_filename_component/KnownComponents.cmake
+++ b/Tests/RunCMake/get_filename_component/KnownComponents.cmake
@@ -159,11 +159,3 @@
     message(SEND_ERROR "${thisVar} not found in regular variable list.")
   endif()
 endforeach()
-
-if(UNIX)
-  file(MAKE_DIRECTORY . "${CMAKE_CURRENT_BINARY_DIR}/subdir")
-  file(CREATE_LINK . "${CMAKE_CURRENT_BINARY_DIR}/subdir/symlink-to-dot" SYMBOLIC)
-  get_filename_component(realpath_actual "${CMAKE_CURRENT_BINARY_DIR}/subdir/symlink-to-dot/.." REALPATH)
-  get_filename_component(realpath_expect "${CMAKE_CURRENT_BINARY_DIR}" REALPATH)
-  check("symlink parent" "${realpath_actual}" "${realpath_expect}")
-endif(UNIX)