From: Richard Smith Date: Wed, 3 Dec 2014 21:00:20 +0000 (+0000) Subject: Teach EvaluatedExprVisitor that the condition and unselected branches of a X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=1780d82f35cf8cbb78cca779c24c7bd36564b67e;p=platform%2Fupstream%2Fllvm.git Teach EvaluatedExprVisitor that the condition and unselected branches of a _Generic expression are unevaluated. llvm-svn: 223266 --- diff --git a/clang/include/clang/AST/EvaluatedExprVisitor.h b/clang/include/clang/AST/EvaluatedExprVisitor.h index 12c4fcc..59de104 100644 --- a/clang/include/clang/AST/EvaluatedExprVisitor.h +++ b/clang/include/clang/AST/EvaluatedExprVisitor.h @@ -56,6 +56,17 @@ public: return this->Visit(E->getChosenSubExpr()); } + void VisitGenericSelectionExpr(GenericSelectionExpr *E) { + // The controlling expression of a generic selection is not evaluated. + + // Don't visit either child expression if the condition is type-dependent. + if (E->isResultDependent()) + return; + // Only the selected subexpression matters; the other subexpressions and the + // controlling expression are not evaluated. + return this->Visit(E->getResultExpr()); + } + void VisitDesignatedInitExpr(DesignatedInitExpr *E) { // Only the actual initializer matters; the designators are all constant // expressions. diff --git a/clang/test/Sema/warn-unsequenced.c b/clang/test/Sema/warn-unsequenced.c index 10c1ff6..70163dc 100644 --- a/clang/test/Sema/warn-unsequenced.c +++ b/clang/test/Sema/warn-unsequenced.c @@ -90,4 +90,7 @@ void test() { (__builtin_classify_type(++a) ? 1 : 0) + ++a; // ok (__builtin_constant_p(++a) ? 1 : 0) + ++a; // ok (__builtin_expect(++a, 0) ? 1 : 0) + ++a; // expected-warning {{multiple unsequenced modifications}} + _Generic(++a, default: 0) + ++a; // ok + sizeof(++a) + ++a; // ok + _Alignof(++a) + ++a; // expected-warning {{extension}} }