Fix handling of the GNU "t ? : f" extension to the conditional
operator in C++, and verify that template instantiation for the
condition operator does the right thing.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@72127 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/test/SemaTemplate/instantiate-expr-3.cpp b/test/SemaTemplate/instantiate-expr-3.cpp
index 892f649..7f54c5d 100644
--- a/test/SemaTemplate/instantiate-expr-3.cpp
+++ b/test/SemaTemplate/instantiate-expr-3.cpp
@@ -1,5 +1,8 @@
 // RUN: clang-cc -fsyntax-only -verify %s
 
+// ---------------------------------------------------------------------
+// Imaginary literals
+// ---------------------------------------------------------------------
 template<typename T>
 struct ImaginaryLiteral0 {
   void f(T &x) {
@@ -10,6 +13,9 @@
 template struct ImaginaryLiteral0<_Complex float>;
 template struct ImaginaryLiteral0<int*>; // expected-note{{instantiation}}
 
+// ---------------------------------------------------------------------
+// Compound assignment operator
+// ---------------------------------------------------------------------
 namespace N1 {
   struct X { };
 
@@ -38,3 +44,15 @@
 template struct N2::PlusEquals0<N3::Y, long, short&>;
 template struct N2::PlusEquals0<int, int, int&>;
 template struct N2::PlusEquals0<N3::Y, int, short&>; // expected-note{{instantiation}}
+
+// ---------------------------------------------------------------------
+// Conditional operator
+// ---------------------------------------------------------------------
+template<typename T, typename U, typename Result>
+struct Conditional0 {
+  void f(T t, U u) {
+    Result result = t? : u;
+  }
+};
+
+template struct Conditional0<int, int, int>;