]> granicus.if.org Git - clang/commitdiff
Teach EvaluatedExprVisitor that the condition and unselected branches of a
authorRichard Smith <richard-llvm@metafoo.co.uk>
Wed, 3 Dec 2014 21:00:20 +0000 (21:00 +0000)
committerRichard Smith <richard-llvm@metafoo.co.uk>
Wed, 3 Dec 2014 21:00:20 +0000 (21:00 +0000)
_Generic expression are unevaluated.

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

include/clang/AST/EvaluatedExprVisitor.h
test/Sema/warn-unsequenced.c

index 12c4fcc49b0132864225758ef37988678f03ef68..59de104b83f9bb7c6e1f2f6ac7eecab3835b63b8 100644 (file)
@@ -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.
index 10c1ff615c0b712913e96ea93fc43b576d04b85c..70163dc0de946866f75e499d745f4872e9ee88b1 100644 (file)
@@ -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}}
 }