c89 does not perform array -> pointer promotion unless the array is an lvalue. This
is different than C99. This fixes the rest of rdar://6095180.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@54064 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp
index 8a4752a..9ffca08 100644
--- a/lib/Sema/SemaExpr.cpp
+++ b/lib/Sema/SemaExpr.cpp
@@ -58,8 +58,16 @@
}
if (Ty->isFunctionType())
ImpCastExprToType(E, Context.getPointerType(Ty));
- else if (Ty->isArrayType())
- ImpCastExprToType(E, Context.getArrayDecayedType(Ty));
+ else if (Ty->isArrayType()) {
+ // In C90 mode, arrays only promote to pointers if the array expression is
+ // an lvalue. The relevant legalese is C90 6.2.2.1p3: "an lvalue that has
+ // type 'array of type' is converted to an expression that has type 'pointer
+ // to type'...". In C99 this was changed to: C99 6.3.2.1p3: "an expression
+ // that has type 'array of type' ...". The relevant change is "an lvalue"
+ // (C90) to "an expression" (C99).
+ if (getLangOptions().C99 || E->isLvalue() == Expr::LV_Valid)
+ ImpCastExprToType(E, Context.getArrayDecayedType(Ty));
+ }
}
/// UsualUnaryConversions - Performs various conversions that are common to most