]> granicus.if.org Git - clang/commitdiff
QualType::isMoreQualifiedThan and isAtLeastAsQualifiedAs assert that we
authorDouglas Gregor <dgregor@apple.com>
Wed, 22 Oct 2008 15:04:37 +0000 (15:04 +0000)
committerDouglas Gregor <dgregor@apple.com>
Wed, 22 Oct 2008 15:04:37 +0000 (15:04 +0000)
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.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@57980 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/AST/Type.h
lib/AST/Expr.cpp
lib/Sema/SemaOverload.cpp

index 85635709e0be4c4eb0815c5089fc71bd13d42c29..29941aad091ee320b6ff6b231e4f65ed26ad7041 100644 (file)
@@ -1362,6 +1362,8 @@ inline bool QualType::isMoreQualifiedThan(QualType Other) const {
   // 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 @@ inline bool QualType::isAtLeastAsQualifiedAs(QualType Other) const {
   // 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;
 }
 
index 4fd8a24c8ada8458d81c195964ed00724a3fb0e6..5c0e38cf9e78eabed70dbdd252c4c11f8f5e0cdb 100644 (file)
@@ -322,6 +322,15 @@ bool Expr::hasLocalSideEffect() const {
   }     
 }
 
+/// 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 @@ Expr::isLvalueResult Expr::isLvalue(ASTContext &Ctx) const {
       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;
   }
index 8e440258b72a18817970dec108ce8f1a14a0dfec..cafdf8794a2fd4c2c14012cf6a1d0cd12642ada5 100644 (file)
@@ -811,6 +811,7 @@ ImplicitConversionSequence::CompareKind
 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