]> granicus.if.org Git - clang/commitdiff
ccc: Implement special language recognition handling for -.
authorDaniel Dunbar <daniel@zuster.org>
Thu, 5 Feb 2009 23:44:44 +0000 (23:44 +0000)
committerDaniel Dunbar <daniel@zuster.org>
Thu, 5 Feb 2009 23:44:44 +0000 (23:44 +0000)
  - <rdar://problem/6551577> [ccc] require -x with -

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

tools/ccc/ccclib/Driver.py
tools/ccc/test/ccc/stdin.c [new file with mode: 0644]

index 30e2ae702d9d88250a396e92ffefc5986fb6e279..9387c37e18f20089bbc868599bc4312450a77994 100644 (file)
@@ -374,27 +374,35 @@ class Driver(object):
                 inputValue = args.getValue(a)
                 if inputType is None:
                     base,ext = os.path.splitext(inputValue)
-                    if ext and ext in Types.kTypeSuffixMap:
+                    # stdin is handled specially.
+                    if inputValue == '-':
+                        if args.getLastArg(self.parser.EOption):
+                            # Treat as a C input needing preprocessing
+                            # (or Obj-C if over-ridden below).
+                            klass = Types.CType
+                        else:
+                            raise Arguments.InvalidArgumentsError("-E or -x required when input is from standard input")
+                    elif ext and ext in Types.kTypeSuffixMap:
                         klass = Types.kTypeSuffixMap[ext]
-
-                        # -ObjC and -ObjC++ over-ride the default
-                        # language, but only for "source files". We
-                        # just treat everything that isn't a linker
-                        # input as a source file.
-                        #
-                        # FIXME: Clean this up if we move the phase
-                        # sequence into the type.
-                        if klass is not Types.ObjectType:
-                            if args.getLastArg(self.parser.ObjCOption):
-                                klass = Types.ObjCType
-                            elif args.getLastArg(self.parser.ObjCXXOption):
-                                klass = Types.ObjCType
                     else:
                         # FIXME: Its not clear why we shouldn't just
                         # revert to unknown. I think this is more likely a
                         # bug / unintended behavior in gcc. Not very
                         # important though.
                         klass = Types.ObjectType
+
+                    # -ObjC and -ObjC++ over-ride the default
+                    # language, but only for "source files". We
+                    # just treat everything that isn't a linker
+                    # input as a source file.
+                    #
+                    # FIXME: Clean this up if we move the phase
+                    # sequence into the type.
+                    if klass is not Types.ObjectType:
+                        if args.getLastArg(self.parser.ObjCOption):
+                            klass = Types.ObjCType
+                        elif args.getLastArg(self.parser.ObjCXXOption):
+                            klass = Types.ObjCType
                 else:
                     assert inputTypeOpt is not None
                     self.claim(inputTypeOpt)
diff --git a/tools/ccc/test/ccc/stdin.c b/tools/ccc/test/ccc/stdin.c
new file mode 100644 (file)
index 0000000..a8df15c
--- /dev/null
@@ -0,0 +1,10 @@
+// RUN: not xcc -### - &> %t &&
+// RUN: grep 'E or -x required when input is from standard input' %t &&
+// RUN: xcc -ccc-print-phases -### -E - &> %t && 
+// RUN: grep '1: preprocessor.*, {0}, cpp-output' %t &&
+// RUN: xcc -ccc-print-phases -### -ObjC -E - &> %t && 
+// RUN: grep '1: preprocessor.*, {0}, objective-c-cpp-output' %t &&
+// RUN: xcc -ccc-print-phases -### -ObjC -x c -E - &> %t && 
+// RUN: grep '1: preprocessor.*, {0}, cpp-output' %t &&
+
+// RUN: true