[cfe-commits] r57980 - in /cfe/trunk: include/clang/AST/Type.h lib/AST/Expr.cpp lib/Sema/SemaOverload.cpp
Douglas Gregor
doug.gregor at gmail.com
Wed Oct 22 08:04:39 PDT 2008
Author: dgregor
Date: Wed Oct 22 10:04:37 2008
New Revision: 57980
URL: http://llvm.org/viewvc/llvm-project?rev=57980&view=rev
Log:
QualType::isMoreQualifiedThan and isAtLeastAsQualifiedAs assert that we
aren't trying to compare with address-space qualifiers (for now).
Clean up handing of DeclRefExprs in Expr::isLvalue and refactor part
of the check into a static DeclCanBeLvalue.
Modified:
cfe/trunk/include/clang/AST/Type.h
cfe/trunk/lib/AST/Expr.cpp
cfe/trunk/lib/Sema/SemaOverload.cpp
Modified: cfe/trunk/include/clang/AST/Type.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/Type.h?rev=57980&r1=57979&r2=57980&view=diff
==============================================================================
--- cfe/trunk/include/clang/AST/Type.h (original)
+++ cfe/trunk/include/clang/AST/Type.h Wed Oct 22 10:04:37 2008
@@ -1362,6 +1362,8 @@
// FIXME: Handle address spaces
unsigned MyQuals = this->getCVRQualifiers();
unsigned OtherQuals = Other.getCVRQualifiers();
+ assert(this->getAddressSpace() == 0 && "Address space not checked");
+ assert(Other.getAddressSpace() == 0 && "Address space not checked");
return MyQuals != OtherQuals && (MyQuals | OtherQuals) == MyQuals;
}
@@ -1373,6 +1375,8 @@
// FIXME: Handle address spaces
unsigned MyQuals = this->getCVRQualifiers();
unsigned OtherQuals = Other.getCVRQualifiers();
+ assert(this->getAddressSpace() == 0 && "Address space not checked");
+ assert(Other.getAddressSpace() == 0 && "Address space not checked");
return (MyQuals | OtherQuals) == MyQuals;
}
Modified: cfe/trunk/lib/AST/Expr.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/Expr.cpp?rev=57980&r1=57979&r2=57980&view=diff
==============================================================================
--- cfe/trunk/lib/AST/Expr.cpp (original)
+++ cfe/trunk/lib/AST/Expr.cpp Wed Oct 22 10:04:37 2008
@@ -322,6 +322,15 @@
}
}
+/// DeclCanBeLvalue - Determine whether the given declaration can be
+/// an lvalue. This is a helper routine for isLvalue.
+static bool DeclCanBeLvalue(const NamedDecl *Decl, ASTContext &Ctx) {
+ return isa<VarDecl>(Decl) ||
+ // C++ 3.10p2: An lvalue refers to an object or function.
+ (Ctx.getLangOptions().CPlusPlus &&
+ (isa<FunctionDecl>(Decl) || isa<OverloadedFunctionDecl>(Decl)));
+}
+
/// isLvalue - C99 6.3.2.1: an lvalue is an expression with an object type or an
/// incomplete type other than void. Nonarray expressions that can be lvalues:
/// - name, where name must be a variable
@@ -359,12 +368,8 @@
return cast<ArraySubscriptExpr>(this)->getBase()->isLvalue(Ctx);
return LV_Valid;
case DeclRefExprClass: { // C99 6.5.1p2
- const Decl *RefdDecl = cast<DeclRefExpr>(this)->getDecl();
- if (isa<VarDecl>(RefdDecl) ||
- isa<ImplicitParamDecl>(RefdDecl) ||
- // C++ 3.10p2: An lvalue refers to an object or function.
- isa<FunctionDecl>(RefdDecl) ||
- isa<OverloadedFunctionDecl>(RefdDecl))
+ const NamedDecl *RefdDecl = cast<DeclRefExpr>(this)->getDecl();
+ if (DeclCanBeLvalue(RefdDecl, Ctx))
return LV_Valid;
break;
}
Modified: cfe/trunk/lib/Sema/SemaOverload.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaOverload.cpp?rev=57980&r1=57979&r2=57980&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaOverload.cpp (original)
+++ cfe/trunk/lib/Sema/SemaOverload.cpp Wed Oct 22 10:04:37 2008
@@ -811,6 +811,7 @@
Sema::CompareQualificationConversions(const StandardConversionSequence& SCS1,
const StandardConversionSequence& SCS2)
{
+ // C++ 13.3.3.2p3:
// -- S1 and S2 differ only in their qualification conversion and
// yield similar types T1 and T2 (C++ 4.4), respectively, and the
// cv-qualification signature of type T1 is a proper subset of
More information about the cfe-commits
mailing list