From: Eli Friedman Date: Sat, 21 Jan 2012 04:44:06 +0000 (+0000) Subject: Fix some comments relating to ExpressionEvaluationContexts. Get rid of a couple... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=78a542478dd63c2789816dcc1cdab5c9a6eef99b;p=clang Fix some comments relating to ExpressionEvaluationContexts. Get rid of a couple of uses of ConstantEvaluated which don't make sense. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@148624 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Sema/Sema.h b/include/clang/Sema/Sema.h index 9735a09598..48d118a397 100644 --- a/include/clang/Sema/Sema.h +++ b/include/clang/Sema/Sema.h @@ -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, diff --git a/lib/Sema/SemaDeclCXX.cpp b/lib/Sema/SemaDeclCXX.cpp index fc16b9bbaf..d68c851d63 100644 --- a/lib/Sema/SemaDeclCXX.cpp +++ b/lib/Sema/SemaDeclCXX.cpp @@ -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. diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp index 613fb73c95..9649666250 100644 --- a/lib/Sema/SemaExpr.cpp +++ b/lib/Sema/SemaExpr.cpp @@ -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(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())) { diff --git a/lib/Sema/SemaType.cpp b/lib/Sema/SemaType.cpp index e1bd813955..e7b899278f 100644 --- a/lib/Sema/SemaType.cpp +++ b/lib/Sema/SemaType.cpp @@ -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.