From: Chris Lattner Date: Fri, 25 Jul 2008 20:54:07 +0000 (+0000) Subject: In c99 mode, comma does do function/array promotion even though X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=53fcaa9409734b8a41c10894d40267e52175b30a;p=clang In c99 mode, comma does do function/array promotion even though 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 --- diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp index 0e70c82637..71482c25a1 100644 --- a/lib/Sema/SemaExpr.cpp +++ b/lib/Sema/SemaExpr.cpp @@ -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(); } diff --git a/test/Sema/expr-comma.c b/test/Sema/expr-comma.c index 7a601e9b3d..4949ee3a83 100644 --- a/test/Sema/expr-comma.c +++ b/test/Sema/expr-comma.c @@ -1,11 +1,18 @@ -// RUN: clang %s -fsyntax-only -verify +// RUN: clang %s -fsyntax-only -verify -std=c99 // rdar://6095180 #include 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];