]> granicus.if.org Git - clang/commitdiff
In c99 mode, comma does do function/array promotion even though
authorChris Lattner <sabre@nondot.org>
Fri, 25 Jul 2008 20:54:07 +0000 (20:54 +0000)
committerChris Lattner <sabre@nondot.org>
Fri, 25 Jul 2008 20:54:07 +0000 (20:54 +0000)
it does not do unary promotions (like short->int).

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

lib/Sema/SemaExpr.cpp
test/Sema/expr-comma.c

index 0e70c82637be35ce63dcabce7d023cd1c6abd316..71482c25a1e7b2d3e272b8eadbd5c9174d8d8fb7 100644 (file)
@@ -1894,7 +1894,9 @@ inline QualType Sema::CheckAssignmentOperands( // C99 6.5.16.1
 
 inline QualType Sema::CheckCommaOperands( // C99 6.5.17
   Expr *&lex, Expr *&rex, SourceLocation loc) {
-  // Comma does not perform unary or binary promotions.
+  
+  // Comma performs lvalue conversion (C99 6.3.2.1), but not unary conversions.
+  DefaultFunctionArrayConversion(rex);
   return rex->getType();
 }
 
index 7a601e9b3d678067775bdb71845074cd7530d8fc..4949ee3a83fcb728f292952595c236040f6df43f 100644 (file)
@@ -1,11 +1,18 @@
-// RUN: clang %s -fsyntax-only -verify
+// RUN: clang %s -fsyntax-only -verify -std=c99
 // rdar://6095180
 
 #include <assert.h>
 struct s { char c[17]; };
-extern struct s foo (void);
+extern struct s foo(void);
 
-// sizeof 'c' should be 17, not sizeof(char*).
-int X[sizeof(0, (foo().c)) == 17 ? 1 : -1];
+struct s a, b, c;
 
+int A[sizeof((foo().c)) == 17 ? 1 : -1];
+int B[sizeof((a.c)) == 17 ? 1 : -1];
+
+
+// comma does array/function promotion in c99.
+int X[sizeof(0, (foo().c)) == sizeof(char*) ? 1 : -1];
+int Y[sizeof(0, (a,b).c) == sizeof(char*) ? 1 : -1];
+int Z[sizeof(0, (a=b).c) == sizeof(char*) ? 1 : -1];