In c99 mode, comma does do function/array promotion even though

it does not do unary promotions (like short->int).

llvm-svn: 54058
This commit is contained in:
Chris Lattner 2008-07-25 20:54:07 +00:00
parent 04350ebe4a
commit f6e1e309c7
2 changed files with 14 additions and 5 deletions

View 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();
}

View 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];