]> granicus.if.org Git - clang/commitdiff
Fix some comments relating to ExpressionEvaluationContexts. Get rid of a couple...
authorEli Friedman <eli.friedman@gmail.com>
Sat, 21 Jan 2012 04:44:06 +0000 (04:44 +0000)
committerEli Friedman <eli.friedman@gmail.com>
Sat, 21 Jan 2012 04:44:06 +0000 (04:44 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@148624 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Sema/Sema.h
lib/Sema/SemaDeclCXX.cpp
lib/Sema/SemaExpr.cpp
lib/Sema/SemaType.cpp

index 9735a095981296a173abe8336981291aa0182368..48d118a397f11f2caedfe18df11218531a82cb87 100644 (file)
@@ -521,9 +521,9 @@ public:
     /// run time.
     Unevaluated,
 
-    /// \brief The current expression and its subexpressions occur within a
-    /// constant expression. Such a context is not potentially-evaluated in
-    /// C++98, but is potentially-evaluated in C++11.
+    /// \brief The current context is "potentially evaluated" in C++11 terms,
+    /// but the expression is evaluated at compile-time (like the values of
+    /// cases in a switch statment).
     ConstantEvaluated,
 
     /// \brief The current expression is potentially evaluated at run time,
index fc16b9bbaf54447e8daddc20254ccd58258613ec..d68c851d63a23f6f37c5bc8563e956c575bd2f6b 100644 (file)
@@ -10751,8 +10751,7 @@ void Sema::MarkVTableUsed(SourceLocation Loc, CXXRecordDecl *Class,
   // not have a vtable.
   if (!Class->isDynamicClass() || Class->isDependentContext() ||
       CurContext->isDependentContext() ||
-      ExprEvalContexts.back().Context == Unevaluated ||
-      ExprEvalContexts.back().Context == ConstantEvaluated)
+      ExprEvalContexts.back().Context == Unevaluated)
     return;
 
   // Try to insert this class into the map.
index 613fb73c9524d72d7b40a9abfaed53841b12dc1a..96496662503c33437e10db34b0c157b6927e1f5d 100644 (file)
@@ -9477,21 +9477,16 @@ void Sema::MarkDeclarationReferenced(SourceLocation Loc, Decl *D) {
   switch (ExprEvalContexts.back().Context) {
     case Unevaluated:
       // We are in an expression that is not potentially evaluated; do nothing.
+      // (Depending on how you read the standard, we actually do need to do
+      // something here for null pointer constants, but the standard's
+      // definition of a null pointer constant is completely crazy.)
       return;
 
     case ConstantEvaluated:
-      // We are in an expression that will be evaluated during translation; in
-      // C++11, we need to define any functions which are used in case they're
-      // constexpr, whereas in C++98, we only need to define static data members
-      // of class templates.
-      if (!getLangOptions().CPlusPlus ||
-          (!getLangOptions().CPlusPlus0x && !isa<VarDecl>(D)))
-        return;
-      break;
-
     case PotentiallyEvaluated:
-      // We are in a potentially-evaluated expression, so this declaration is
-      // "used"; handle this below.
+      // We are in a potentially evaluated expression (or a constant-expression
+      // in C++03); we need to do implicit template instantiation, implicitly
+      // define class members, and mark most declarations as used.
       break;
 
     case PotentiallyEvaluatedIfUsed:
@@ -9616,6 +9611,8 @@ void Sema::MarkDeclarationReferenced(SourceLocation Loc, Decl *D) {
     // Keep track of used but undefined variables.  We make a hole in
     // the warning for static const data members with in-line
     // initializers.
+    // FIXME: The hole we make for static const data members is too wide!
+    // We need to implement the C++11 rules for odr-used.
     if (Var->hasDefinition() == VarDecl::DeclarationOnly
         && Var->getLinkage() != ExternalLinkage
         && !(Var->isStaticDataMember() && Var->hasInit())) {
index e1bd8139552540bf121cec1c1257f05b4d5c4a6d..e7b899278f551a87f5d661a45c4b21b252d4ae42 100644 (file)
@@ -1059,8 +1059,7 @@ static QualType inferARCLifetimeForPointee(Sema &S, QualType type,
 
   // If we are in an unevaluated context, like sizeof, skip adding a
   // qualification.
-  } else if (S.ExprEvalContexts.back().Context == Sema::Unevaluated ||
-             S.ExprEvalContexts.back().Context == Sema::ConstantEvaluated) {
+  } else if (S.ExprEvalContexts.back().Context == Sema::Unevaluated) {
     return type;
 
   // If that failed, give an error and recover using __autoreleasing.