]> git.ipfire.org Git - thirdparty/ccache.git/commitdiff
Correctly handle -MF/-MT/-MQ with concatenated argument last on commandline
authorJoel Rosdahl <joel@rosdahl.net>
Wed, 13 Apr 2011 19:58:29 +0000 (21:58 +0200)
committerJoel Rosdahl <joel@rosdahl.net>
Wed, 13 Apr 2011 19:58:29 +0000 (21:58 +0200)
ccache.c
test/test_argument_processing.c

index 6786ee399f823ba8fd17bec0e874bc32ad045cb9..b5b1c408449391b8e85e524ed9251830b1ab32eb 100644 (file)
--- a/ccache.c
+++ b/ccache.c
@@ -1365,34 +1365,44 @@ cc_process_args(struct args *orig_args, struct args **preprocessor_args,
                        args_add(dep_args, argv[i]);
                        continue;
                }
-               if (i < argc - 1) {
-                       if (str_startswith(argv[i], "-MF")) {
-                               char *arg;
-                               dependency_filename_specified = true;
-                               free(output_dep);
-                               args_add(dep_args, argv[i]);
-                               if (strlen(argv[i]) == 3) {
-                                       /* -MF arg */
-                                       arg = argv[i + 1];
-                                       args_add(dep_args, argv[i + 1]);
-                                       i++;
-                               } else {
-                                       /* -MFarg */
-                                       arg = &argv[i][3];
+               if (str_startswith(argv[i], "-MF")) {
+                       char *arg;
+                       dependency_filename_specified = true;
+                       free(output_dep);
+                       args_add(dep_args, argv[i]);
+                       if (strlen(argv[i]) == 3) {
+                               /* -MF arg */
+                               if (i >= argc - 1) {
+                                       cc_log("Missing argument to %s", argv[i]);
+                                       stats_update(STATS_ARGS);
+                                       result = false;
+                                       goto out;
                                }
-                               output_dep = make_relative_path(x_strdup(arg));
-                               continue;
-                       } else if (str_startswith(argv[i], "-MQ")
-                                  || str_startswith(argv[i], "-MT")) {
-                               dependency_target_specified = true;
-                               args_add(dep_args, argv[i]);
-                               if (strlen(argv[i]) == 3) {
-                                       /* -MQ arg or -MT arg */
-                                       args_add(dep_args, argv[i + 1]);
-                                       i++;
+                               arg = argv[i + 1];
+                               args_add(dep_args, argv[i + 1]);
+                               i++;
+                       } else {
+                               /* -MFarg */
+                               arg = &argv[i][3];
+                       }
+                       output_dep = make_relative_path(x_strdup(arg));
+                       continue;
+               }
+               if (str_startswith(argv[i], "-MQ") || str_startswith(argv[i], "-MT")) {
+                       dependency_target_specified = true;
+                       args_add(dep_args, argv[i]);
+                       if (strlen(argv[i]) == 3) {
+                               /* -MQ arg or -MT arg */
+                               if (i >= argc - 1) {
+                                       cc_log("Missing argument to %s", argv[i]);
+                                       stats_update(STATS_ARGS);
+                                       result = false;
+                                       goto out;
                                }
-                               continue;
+                               args_add(dep_args, argv[i + 1]);
+                               i++;
                        }
+                       continue;
                }
                if (str_startswith(argv[i], "-Wp,")) {
                        if (str_startswith(argv[i], "-Wp,-MD,") && !strchr(argv[i] + 8, ',')) {
index 4ebf93f5462167521417096b9f45c6dcea3b7041..75f3a2e8e9e1ca68fb80fc72e9d9d44be075a380 100644 (file)
@@ -86,4 +86,55 @@ TEST(dependency_flags_that_take_an_argument_should_not_require_space_delimiter)
        args_free(orig);
 }
 
+TEST(MF_flag_with_immediate_argument_should_work_as_last_argument)
+{
+       struct args *orig = args_init_from_string(
+               "cc -c foo.c -o foo.o -MMD -MTbar -MFfoo.d");
+       struct args *exp_cpp = args_init_from_string(
+               "cc -c -MMD -MTbar -MFfoo.d");
+       struct args *exp_cc = args_init_from_string("cc -c");
+       struct args *act_cpp = NULL, *act_cc = NULL;
+       create_file("foo.c", "");
+
+       CHECK(cc_process_args(orig, &act_cpp, &act_cc));
+       CHECK_ARGS_EQ_FREE12(exp_cpp, act_cpp);
+       CHECK_ARGS_EQ_FREE12(exp_cc, act_cc);
+
+       args_free(orig);
+}
+
+TEST(MT_flag_with_immediate_argument_should_work_as_last_argument)
+{
+       struct args *orig = args_init_from_string(
+               "cc -c foo.c -o foo.o -MMD -MFfoo.d -MTbar");
+       struct args *exp_cpp = args_init_from_string(
+               "cc -c -MMD -MFfoo.d -MTbar");
+       struct args *exp_cc = args_init_from_string("cc -c");
+       struct args *act_cpp = NULL, *act_cc = NULL;
+       create_file("foo.c", "");
+
+       CHECK(cc_process_args(orig, &act_cpp, &act_cc));
+       CHECK_ARGS_EQ_FREE12(exp_cpp, act_cpp);
+       CHECK_ARGS_EQ_FREE12(exp_cc, act_cc);
+
+       args_free(orig);
+}
+
+TEST(MQ_flag_with_immediate_argument_should_work_as_last_argument)
+{
+       struct args *orig = args_init_from_string(
+               "cc -c foo.c -o foo.o -MMD -MFfoo.d -MQbar");
+       struct args *exp_cpp = args_init_from_string(
+               "cc -c -MMD -MFfoo.d -MQbar");
+       struct args *exp_cc = args_init_from_string("cc -c");
+       struct args *act_cpp = NULL, *act_cc = NULL;
+       create_file("foo.c", "");
+
+       CHECK(cc_process_args(orig, &act_cpp, &act_cc));
+       CHECK_ARGS_EQ_FREE12(exp_cpp, act_cpp);
+       CHECK_ARGS_EQ_FREE12(exp_cc, act_cc);
+
+       args_free(orig);
+}
+
 TEST_SUITE_END