diff --git a/include/clang/Basic/DiagnosticFrontendKinds.td b/include/clang/Basic/DiagnosticFrontendKinds.td
index 73562cd..680648c 100644
--- a/include/clang/Basic/DiagnosticFrontendKinds.td
+++ b/include/clang/Basic/DiagnosticFrontendKinds.td
@@ -116,6 +116,8 @@ def warn_unknown_warning_specifier : Warning<
     "unknown %0 warning specifier: '%1'">,
     InGroup<UnknownWarningOption>;
 
+def err_unknown_f_option : Error<"unknown flag: '%0'">;
+
 def err_unknown_analyzer_checker : Error<
     "no analyzer checkers are associated with '%0'">;
 def warn_incompatible_analyzer_plugin_api : Warning<
diff --git a/include/clang/Driver/Options.td b/include/clang/Driver/Options.td
index dddcf44..658ad62 100644
--- a/include/clang/Driver/Options.td
+++ b/include/clang/Driver/Options.td
@@ -823,6 +823,7 @@ def fdata_sections : Flag <["-"], "fdata-sections">, Group<f_Group>, Flags<[CC1O
   HelpText<"Place each data in its own section (ELF Only)">;
 def fdebug_types_section: Flag <["-"], "fdebug-types-section">, Group<f_Group>,
   Flags<[CC1Option]>, HelpText<"Place debug types in their own section (ELF Only)">;
+def f : Joined<["-"], "f">, Group<f_Group>, Flags<[CC1Option]>;
 def g_Flag : Flag<["-"], "g">, Group<g_Group>,
   HelpText<"Generate source level debug information">, Flags<[CC1Option]>;
 def gline_tables_only : Flag<["-"], "gline-tables-only">, Group<g_Group>,
diff --git a/lib/Driver/Tools.cpp b/lib/Driver/Tools.cpp
index 322fe5a..fe1e47b 100644
--- a/lib/Driver/Tools.cpp
+++ b/lib/Driver/Tools.cpp
@@ -2652,6 +2652,7 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
   // precompiling.
   Args.ClaimAllArgs(options::OPT_flto);
 
+  Args.AddAllArgs(CmdArgs, options::OPT_f);
   Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
   if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
     CmdArgs.push_back("-pedantic");
diff --git a/lib/Frontend/CompilerInvocation.cpp b/lib/Frontend/CompilerInvocation.cpp
index d25801a..0150c09 100644
--- a/lib/Frontend/CompilerInvocation.cpp
+++ b/lib/Frontend/CompilerInvocation.cpp
@@ -14,6 +14,7 @@
 #include "clang/Driver/DriverDiagnostic.h"
 #include "clang/Driver/Options.h"
 #include "clang/Driver/Util.h"
+#include "clang/Frontend/FrontendDiagnostic.h"
 #include "clang/Frontend/LangStandard.h"
 #include "clang/Frontend/Utils.h"
 #include "clang/Lex/HeaderSearchOptions.h"
@@ -523,6 +524,22 @@ static void ParseDependencyOutputArgs(DependencyOutputOptions &Opts,
   Opts.DOTOutputFile = Args.getLastArgValue(OPT_dependency_dot);
 }
 
+static bool parseFFlagOptions(ArgList &Args, DiagnosticsEngine &Diags) {
+  bool Success = true;
+  for (arg_iterator I = Args.filtered_begin(OPT_f),
+         E = Args.filtered_end(); I != E; ++I) {
+    // For now all -f options are handled manually, so any occurrence of
+    // OPT_f means an unknown option.
+    Arg *A = *I;
+    StringRef Name = A->getValue();
+    if (Name.startswith("no-"))
+      Name = Name.substr(3);
+    Diags.Report(diag::err_unknown_f_option) << Name;
+    Success=false;
+  }
+  return Success;
+}
+
 bool clang::ParseDiagnosticArgs(DiagnosticOptions &Opts, ArgList &Args,
                                 DiagnosticsEngine *Diags) {
   using namespace options;
@@ -1615,6 +1632,7 @@ bool CompilerInvocation::CreateFromArgs(CompilerInvocation &Res,
     Success = false;
   }
 
+  Success = parseFFlagOptions(*Args, Diags) && Success;
   Success = ParseAnalyzerArgs(*Res.getAnalyzerOpts(), *Args, Diags) && Success;
   Success = ParseMigratorArgs(Res.getMigratorOpts(), *Args) && Success;
   ParseDependencyOutputArgs(Res.getDependencyOutputOpts(), *Args);
diff --git a/test/Driver/no-objc-default-synthesize-properties.m b/test/Driver/no-objc-default-synthesize-properties.m
index a034926..0da87af 100644
--- a/test/Driver/no-objc-default-synthesize-properties.m
+++ b/test/Driver/no-objc-default-synthesize-properties.m
@@ -1,4 +1,5 @@
-// RUN: not %clang  -fsyntax-only -fno-objc-default-synthesize-properties -fobjc-default-synthesize-properties %s 2>&1 | FileCheck %s
+// RUN: not %clang  -fsyntax-only -fno-objc-default-synthesize-properties %s 2>&1 | FileCheck %s
+// RUN: not %clang  -fsyntax-only -fobjc-default-synthesize-properties %s 2>&1 | FileCheck %s
 
 @interface I
 @property int P;
@@ -6,5 +7,4 @@
 
 @implementation I
 @end
-// CHECK: error: unknown argument: '-fno-objc-default-synthesize-properties'
-// CHECK: error: unknown argument: '-fobjc-default-synthesize-properties'
+// CHECK: error: unknown flag: 'objc-default-synthesize-properties'
diff --git a/test/Driver/unknown-arg.c b/test/Driver/unknown-arg.c
index f834a0e..05a1b41 100644
--- a/test/Driver/unknown-arg.c
+++ b/test/Driver/unknown-arg.c
@@ -1,4 +1,4 @@
-// RUN: not %clang %s -cake-is-lie -%0 -%d -HHHH -munknown-to-clang-option -print-stats -funknown-to-clang-option 2>&1 | \
+// RUN: not %clang %s -cake-is-lie -%0 -%d -HHHH -munknown-to-clang-option -print-stats 2>&1 | \
 // RUN: FileCheck %s
 
 // CHECK: unknown argument: '-cake-is-lie'
@@ -7,7 +7,10 @@
 // CHECK: unknown argument: '-HHHH'
 // CHECK: unknown argument: '-munknown-to-clang-option'
 // CHECK: unknown argument: '-print-stats'
-// CHECK: unknown argument: '-funknown-to-clang-option'
+
+
+// RUN: not %clang %s -funknown-to-clang-option 2>&1 | FileCheck --check-prefix=CHECK-F %s
+// CHECK-F: unknown flag: 'unknown-to-clang-option'
 
 
 // RUN: %clang -S %s -o %t.s  -Wunknown-to-clang-option 2>&1 | FileCheck --check-prefix=IGNORED %s
