summaryrefslogtreecommitdiffstats
path: root/clang/lib/Sema
diff options
context:
space:
mode:
authorRichard Smith <richard-llvm@metafoo.co.uk>2011-12-21 02:55:12 +0000
committerRichard Smith <richard-llvm@metafoo.co.uk>2011-12-21 02:55:12 +0000
commit242ad89a15d5466d166d47978bfff983d40ab511 (patch)
tree6dbdd5a89a0874ea2545ebb1c6d6089fbc5dfa49 /clang/lib/Sema
parentb9ccd553fca066e8f5e1353e612ef91bb85d20d1 (diff)
downloadbcm5719-llvm-242ad89a15d5466d166d47978bfff983d40ab511.tar.gz
bcm5719-llvm-242ad89a15d5466d166d47978bfff983d40ab511.zip
C++11 half of r147023: In C++11, additionally eagerly instantiate:
- constexpr function template instantiations - variables of reference type - constexpr variables llvm-svn: 147031
Diffstat (limited to 'clang/lib/Sema')
-rw-r--r--clang/lib/Sema/SemaDecl.cpp3
-rw-r--r--clang/lib/Sema/SemaExpr.cpp11
2 files changed, 9 insertions, 5 deletions
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index ebcdcf58d04..9ae39f1af38 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -6544,8 +6544,7 @@ void Sema::CheckCompleteVariableDeclaration(VarDecl *var) {
for (unsigned I = 0, N = Notes.size(); I != N; ++I)
Diag(Notes[I].first, Notes[I].second);
}
- } else if (getLangOptions().CPlusPlus && !Type.isVolatileQualified() &&
- Type.isConstQualified() && Type->isIntegralOrEnumerationType()) {
+ } else if (var->isUsableInConstantExpressions()) {
// Check whether the initializer of a const variable of integral or
// enumeration type is an ICE now, since we can't tell whether it was
// initialized by a constant expression if we check later.
diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp
index 3a61fe50666..9d2298a704b 100644
--- a/clang/lib/Sema/SemaExpr.cpp
+++ b/clang/lib/Sema/SemaExpr.cpp
@@ -9491,6 +9491,11 @@ void Sema::MarkDeclarationReferenced(SourceLocation Loc, Decl *D) {
cast<CXXRecordDecl>(Function->getDeclContext())->isLocalClass())
PendingLocalImplicitInstantiations.push_back(std::make_pair(Function,
Loc));
+ else if (Function->getTemplateInstantiationPattern()->isConstexpr())
+ // Do not defer instantiations of constexpr functions, to avoid the
+ // expression evaluator needing to call back into Sema if it sees a
+ // call to such a function.
+ InstantiateFunctionDefinition(Loc, Function);
else
PendingInstantiations.push_back(std::make_pair(Function, Loc));
}
@@ -9526,9 +9531,9 @@ void Sema::MarkDeclarationReferenced(SourceLocation Loc, Decl *D) {
// This is a modification of an existing AST node. Notify listeners.
if (ASTMutationListener *L = getASTMutationListener())
L->StaticDataMemberInstantiated(Var);
- QualType T = Var->getType();
- if (T.isConstQualified() && !T.isVolatileQualified() &&
- T->isIntegralOrEnumerationType())
+ if (Var->isUsableInConstantExpressions())
+ // Do not defer instantiations of variables which could be used in a
+ // constant expression.
InstantiateStaticDataMemberDefinition(Loc, Var);
else
PendingInstantiations.push_back(std::make_pair(Var, Loc));
OpenPOWER on IntegriCloud