]> granicus.if.org Git - clang/commitdiff
When used in a compound expression FP_CONTRACT should proceed all explicit
authorLang Hames <lhames@gmail.com>
Sun, 21 Oct 2012 01:10:01 +0000 (01:10 +0000)
committerLang Hames <lhames@gmail.com>
Sun, 21 Oct 2012 01:10:01 +0000 (01:10 +0000)
declarations and statements. Emit an error if the FP_CONTRACT is used
later in a compound statement.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@166383 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/DiagnosticParseKinds.td
lib/Parse/ParseStmt.cpp
test/CodeGen/fp-contract-pragma.cpp
test/Parser/pragma-fp-contract.c [new file with mode: 0644]

index b670d6e8cb7a73012f1208b2e5a87141a10b0cbd..e01cdb77e55c0686a1ae0ad95bf90c26ed603275 100644 (file)
@@ -729,6 +729,10 @@ def warn_pragma_unused_expected_var : Warning<
   "expected '#pragma unused' argument to be a variable name">;
 def warn_pragma_unused_expected_punc : Warning<
   "expected ')' or ',' in '#pragma unused'">;
+// - #pragam fp_contract
+def err_pragma_fp_contract_scope : Error<
+  "'#pragma fp_contract' should only appear at file scope or at the start of a "
+  "compound expression">; 
 
 // OpenCL Section 6.8.g
 def err_not_opencl_storage_class_specifier : Error<
index d008b037b0e01b613f87a3c9442f6303fc4a64a6..964240df089bf5d0d66fca7e6a849c4b21459cab 100644 (file)
@@ -280,9 +280,10 @@ Retry:
     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 @@ StmtResult Parser::ParseCompoundStatementBody(bool isStmtExpr) {
 
   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__)) {
index edb04d82ef540307fdd6bfa3775fb45100998a31..afd8c43121e6e7e50c0cad9c7673232fae04679f 100644 (file)
@@ -39,7 +39,6 @@ template<typename T> class fp_contract_4 {
   float method(float a, float b, float c) {
     #pragma STDC FP_CONTRACT ON
     return a * b + c;
-    #pragma STDC FP_CONTRACT OFF    
   }
 };
 
diff --git a/test/Parser/pragma-fp-contract.c b/test/Parser/pragma-fp-contract.c
new file mode 100644 (file)
index 0000000..619053f
--- /dev/null
@@ -0,0 +1,6 @@
+// RUN: %clang_cc1 -fsyntax-only -verify %s
+
+void f1(void) {
+  int x = 0;
+/* expected-error {{'#pragma fp_contract' should only appear at file scope or at the start of a compound expression}} */ #pragma STDC FP_CONTRACT ON
+}