[cfe-commits] r130710 - in /cfe/trunk: include/clang/Frontend/LangStandard.h include/clang/Frontend/LangStandards.def lib/Frontend/CompilerInvocation.cpp

Chad Rosier mcrosier at apple.com
Mon May 2 12:24:53 PDT 2011


Author: mcrosier
Date: Mon May  2 14:24:53 2011
New Revision: 130710

URL: http://llvm.org/viewvc/llvm-project?rev=130710&view=rev
Log:
When using -std= flag added check to make sure language and standard are compatable

Modified:
    cfe/trunk/include/clang/Frontend/LangStandard.h
    cfe/trunk/include/clang/Frontend/LangStandards.def
    cfe/trunk/lib/Frontend/CompilerInvocation.cpp

Modified: cfe/trunk/include/clang/Frontend/LangStandard.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Frontend/LangStandard.h?rev=130710&r1=130709&r2=130710&view=diff
==============================================================================
--- cfe/trunk/include/clang/Frontend/LangStandard.h (original)
+++ cfe/trunk/include/clang/Frontend/LangStandard.h Mon May  2 14:24:53 2011
@@ -18,14 +18,15 @@
 
 enum LangFeatures {
   BCPLComment = (1 << 0),
-  C99 = (1 << 1),
-  C1X = (1 << 2),
-  CPlusPlus = (1 << 3),
-  CPlusPlus0x = (1 << 4),
-  Digraphs = (1 << 5),
-  GNUMode = (1 << 6),
-  HexFloat = (1 << 7),
-  ImplicitInt = (1 << 8)
+  C89 = (1 << 1),
+  C99 = (1 << 2),
+  C1X = (1 << 3),
+  CPlusPlus = (1 << 4),
+  CPlusPlus0x = (1 << 5),
+  Digraphs = (1 << 6),
+  GNUMode = (1 << 7),
+  HexFloat = (1 << 8),
+  ImplicitInt = (1 << 9)
 };
 
 }
@@ -54,6 +55,9 @@
   /// hasBCPLComments - Language supports '//' comments.
   bool hasBCPLComments() const { return Flags & frontend::BCPLComment; }
 
+  /// isC89 - Language is a superset of C89.
+  bool isC89() const { return Flags & frontend::C89; }
+
   /// isC99 - Language is a superset of C99.
   bool isC99() const { return Flags & frontend::C99; }
 

Modified: cfe/trunk/include/clang/Frontend/LangStandards.def
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Frontend/LangStandards.def?rev=130710&r1=130709&r2=130710&view=diff
==============================================================================
--- cfe/trunk/include/clang/Frontend/LangStandards.def (original)
+++ cfe/trunk/include/clang/Frontend/LangStandards.def Mon May  2 14:24:53 2011
@@ -22,21 +22,21 @@
 // C89-ish modes.
 LANGSTANDARD(c89, "c89",
              "ISO C 1990",
-             ImplicitInt)
+             C89 | ImplicitInt)
 LANGSTANDARD(c90, "c90",
              "ISO C 1990",
-             ImplicitInt)
+             C89 | ImplicitInt)
 LANGSTANDARD(iso9899_1990, "iso9899:1990",
              "ISO C 1990",
-             ImplicitInt)
+             C89 | ImplicitInt)
 
 LANGSTANDARD(c94, "iso9899:199409",
              "ISO C 1990 with amendment 1",
-             Digraphs | ImplicitInt)
+             C89 | Digraphs | ImplicitInt)
 
 LANGSTANDARD(gnu89, "gnu89",
              "ISO C 1990 with GNU extensions",
-             BCPLComment | Digraphs | GNUMode | ImplicitInt)
+             BCPLComment | C89 | Digraphs | GNUMode | ImplicitInt)
 
 // C99-ish modes
 LANGSTANDARD(c99, "c99",
@@ -87,7 +87,6 @@
              BCPLComment | CPlusPlus | CPlusPlus0x | Digraphs | GNUMode)
 
 // OpenCL
-
 LANGSTANDARD(opencl, "cl",
              "OpenCL 1.0",
              BCPLComment | C99 | Digraphs | HexFloat)

Modified: cfe/trunk/lib/Frontend/CompilerInvocation.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/CompilerInvocation.cpp?rev=130710&r1=130709&r2=130710&view=diff
==============================================================================
--- cfe/trunk/lib/Frontend/CompilerInvocation.cpp (original)
+++ cfe/trunk/lib/Frontend/CompilerInvocation.cpp Mon May  2 14:24:53 2011
@@ -1397,6 +1397,40 @@
     if (LangStd == LangStandard::lang_unspecified)
       Diags.Report(diag::err_drv_invalid_value)
         << A->getAsString(Args) << A->getValue(Args);
+    else {
+      // Valid standard, check to make sure language and standard are compatable.    
+      const LangStandard &Std = LangStandard::getLangStandardForKind(LangStd);
+      switch (IK) {
+      case IK_C:
+      case IK_ObjC:
+      case IK_PreprocessedC:
+      case IK_PreprocessedObjC:
+        if (!(Std.isC89() || Std.isC99()))
+          Diags.Report(diag::err_drv_argument_not_allowed_with)
+            << A->getAsString(Args) << "C/ObjC";
+        break;
+      case IK_CXX:
+      case IK_ObjCXX:
+      case IK_PreprocessedCXX:
+      case IK_PreprocessedObjCXX:
+        if (!Std.isCPlusPlus())
+          Diags.Report(diag::err_drv_argument_not_allowed_with)
+            << A->getAsString(Args) << "C++/ObjC++";
+        break;
+      case IK_OpenCL:
+        if (!Std.isC99())
+          Diags.Report(diag::err_drv_argument_not_allowed_with)
+            << A->getAsString(Args) << "OpenCL";
+        break;
+      case IK_CUDA:
+        if (!Std.isCPlusPlus())
+          Diags.Report(diag::err_drv_argument_not_allowed_with)
+            << A->getAsString(Args) << "CUDA";
+        break;
+      default:
+        break;
+      }
+    }
   }
 
   if (const Arg *A = Args.getLastArg(OPT_cl_std_EQ)) {





More information about the cfe-commits mailing list