When used in a compound expression FP_CONTRACT should proceed all explicit
declarations and statements. Emit an error if the FP_CONTRACT is used
later in a compound statement.

llvm-svn: 166383
diff --git a/clang/lib/Parse/ParseStmt.cpp b/clang/lib/Parse/ParseStmt.cpp
index d008b03..964240d 100644
--- a/clang/lib/Parse/ParseStmt.cpp
+++ b/clang/lib/Parse/ParseStmt.cpp
@@ -280,9 +280,10 @@
     return StmtEmpty();
 
   case tok::annot_pragma_fp_contract:
-    ProhibitAttributes(Attrs);
-    HandlePragmaFPContract();
-    return StmtEmpty();
+    Diag(Tok, diag::err_pragma_fp_contract_scope);
+    ConsumeToken();
+    return StmtError();
+
 
   case tok::annot_pragma_opencl_extension:
     ProhibitAttributes(Attrs);
@@ -728,6 +729,10 @@
 
   StmtVector Stmts;
 
+  // Parse FP_CONTRACT if present.
+  if (Tok.is(tok::annot_pragma_fp_contract))
+    HandlePragmaFPContract();
+
   // "__label__ X, Y, Z;" is the GNU "Local Label" extension.  These are
   // only allowed at the start of a compound stmt regardless of the language.
   while (Tok.is(tok::kw___label__)) {