Author: aaronballman Date: Wed Nov 4 18:06:05 2015 New Revision: 252104 URL: http://llvm.org/viewvc/llvm-project?rev=252104&view=rev Log: The control expression for a _Generic selection expression should have its type decayed and qualifiers stripped when determining which selection it matches. Fixes PR16340.
Modified: cfe/trunk/lib/Sema/SemaExpr.cpp cfe/trunk/test/Sema/generic-selection.c Modified: cfe/trunk/lib/Sema/SemaExpr.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=252104&r1=252103&r2=252104&view=diff ============================================================================== --- cfe/trunk/lib/Sema/SemaExpr.cpp (original) +++ cfe/trunk/lib/Sema/SemaExpr.cpp Wed Nov 4 18:06:05 2015 @@ -1354,11 +1354,13 @@ Sema::CreateGenericSelectionExpr(SourceL ArrayRef<Expr *> Exprs) { unsigned NumAssocs = Types.size(); assert(NumAssocs == Exprs.size()); - if (ControllingExpr->getType()->isPlaceholderType()) { - ExprResult result = CheckPlaceholderExpr(ControllingExpr); - if (result.isInvalid()) return ExprError(); - ControllingExpr = result.get(); - } + + // Decay and strip qualifiers for the controlling expression type, and handle + // placeholder type replacement. See committee discussion from WG14 DR423. + ExprResult R = DefaultFunctionArrayLvalueConversion(ControllingExpr); + if (R.isInvalid()) + return ExprError(); + ControllingExpr = R.get(); // The controlling expression is an unevaluated operand, so side effects are // likely unintended. Modified: cfe/trunk/test/Sema/generic-selection.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/generic-selection.c?rev=252104&r1=252103&r2=252104&view=diff ============================================================================== --- cfe/trunk/test/Sema/generic-selection.c (original) +++ cfe/trunk/test/Sema/generic-selection.c Wed Nov 4 18:06:05 2015 @@ -1,5 +1,7 @@ // RUN: %clang_cc1 -std=c1x -fsyntax-only -verify %s +void g(void); + void foo(int n) { (void) _Generic(0, struct A: 0, // expected-error {{type 'struct A' in generic association incomplete}} @@ -23,4 +25,10 @@ void foo(int n) { int a4[_Generic(0L, default: 1, short: 2, float: 3, int: 4) == 1 ? 1 : -1]; int a5[_Generic(0, int: 1, short: 2, float: 3) == 1 ? 1 : -1]; int a6[_Generic(0, short: 1, float: 2, int: 3) == 3 ? 1 : -1]; + + int a7[_Generic("test", char *: 1, default: 2) == 1 ? 1 : -1]; + int a8[_Generic(g, void (*)(void): 1, default: 2) == 1 ? 1 : -1]; + + const int i = 12; + int a9[_Generic(i, int: 1, default: 2) == 1 ? 1 : -1]; } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits