summaryrefslogtreecommitdiffstats
path: root/clang/lib/AST
diff options
context:
space:
mode:
authorEli Friedman <eli.friedman@gmail.com>2009-05-03 22:36:05 +0000
committerEli Friedman <eli.friedman@gmail.com>2009-05-03 22:36:05 +0000
commitb8c4fd8cfd27dbc63e1706729be4b330bf946a0c (patch)
tree49b37e6478c4351aec75ff84f6f8696af839cde3 /clang/lib/AST
parentba49fef34a7150c74f244e6fe134830d44587998 (diff)
downloadbcm5719-llvm-b8c4fd8cfd27dbc63e1706729be4b330bf946a0c.tar.gz
bcm5719-llvm-b8c4fd8cfd27dbc63e1706729be4b330bf946a0c.zip
PR2524: downgrade taking address of expression of type 'void' to an
extension warning. llvm-svn: 70805
Diffstat (limited to 'clang/lib/AST')
-rw-r--r--clang/lib/AST/Expr.cpp16
1 files changed, 11 insertions, 5 deletions
diff --git a/clang/lib/AST/Expr.cpp b/clang/lib/AST/Expr.cpp
index 19d67bb7f8a..13d2a1be3f9 100644
--- a/clang/lib/AST/Expr.cpp
+++ b/clang/lib/AST/Expr.cpp
@@ -603,18 +603,26 @@ static bool DeclCanBeLvalue(const NamedDecl *Decl, ASTContext &Ctx) {
/// - reference type [C++ [expr]]
///
Expr::isLvalueResult Expr::isLvalue(ASTContext &Ctx) const {
+ assert(!TR->isReferenceType() && "Expressions can't have reference type.");
+
+ isLvalueResult Res = isLvalueInternal(Ctx);
+ if (Res != LV_Valid || Ctx.getLangOptions().CPlusPlus)
+ return Res;
+
// first, check the type (C99 6.3.2.1). Expressions with function
// type in C are not lvalues, but they can be lvalues in C++.
- if (!Ctx.getLangOptions().CPlusPlus && TR->isFunctionType())
+ if (TR->isFunctionType())
return LV_NotObjectType;
// Allow qualified void which is an incomplete type other than void (yuck).
if (TR->isVoidType() && !Ctx.getCanonicalType(TR).getCVRQualifiers())
return LV_IncompleteVoidType;
- assert(!TR->isReferenceType() && "Expressions can't have reference type.");
+ return LV_Valid;
+}
- // the type looks fine, now check the expression
+// Check whether the expression can be sanely treated like an l-value
+Expr::isLvalueResult Expr::isLvalueInternal(ASTContext &Ctx) const {
switch (getStmtClass()) {
case StringLiteralClass: // C99 6.5.1p4
case ObjCEncodeExprClass: // @encode behaves like its string in every way.
@@ -754,8 +762,6 @@ Expr::isLvalueResult Expr::isLvalue(ASTContext &Ctx) const {
return LV_Valid;
case PredefinedExprClass:
return LV_Valid;
- case VAArgExprClass:
- return LV_NotObjectType;
case CXXDefaultArgExprClass:
return cast<CXXDefaultArgExpr>(this)->getExpr()->isLvalue(Ctx);
case CXXConditionDeclExprClass:
OpenPOWER on IntegriCloud