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, ',')) {
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