diff options
Diffstat (limited to 'clang')
| -rw-r--r-- | clang/lib/Sema/SemaExpr.cpp | 4 | ||||
| -rw-r--r-- | clang/test/Sema/expr-comma.c | 15 |
2 files changed, 14 insertions, 5 deletions
diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index 0e70c82637b..71482c25a1e 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/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/clang/test/Sema/expr-comma.c b/clang/test/Sema/expr-comma.c index 7a601e9b3d6..4949ee3a83f 100644 --- a/clang/test/Sema/expr-comma.c +++ b/clang/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 <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]; |

