diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -8071,6 +8071,16 @@ VK = VK_RValue; OK = OK_Ordinary; + if (getLangOpts().CDependence && + (Cond.get()->isTypeDependent() || LHS.get()->isTypeDependent() || + RHS.get()->isTypeDependent())) { + assert(!getLangOpts().CPlusPlus); + assert(Cond.get()->containsErrors() || LHS.get()->containsErrors() || + RHS.get()->containsErrors() && + "should only occur in error-recovery path."); + return Context.DependentTy; + } + // The OpenCL operator with a vector condition is sufficiently // different to merit its own checker. if ((getLangOpts().OpenCL && Cond.get()->getType()->isVectorType()) || diff --git a/clang/test/Sema/error-dependence.c b/clang/test/Sema/error-dependence.c --- a/clang/test/Sema/error-dependence.c +++ b/clang/test/Sema/error-dependence.c @@ -11,3 +11,9 @@ // or function pointer" is not emitted. (*__builtin_classify_type)(1); // expected-error {{builtin functions must be directly called}} } + +void test2(int* ptr, float f) { + // verify diagnostic "used type '' where arithmetic or pointer + // type is required" is not emitted. + ptr > f ? ptr : f; // expected-error {{invalid operands to binary expression}} +}