This revision was automatically updated to reflect the committed changes.
Closed by commit rL267975: [Parser] Clear the TemplateParamScope bit of the
current scope's flag (authored by ahatanak).
Changed prior to commit:
http://reviews.llvm.org/D19175?vs=55484&id=55523#toc
Repository:
rL LLVM
http://reviews.llvm.org/D19175
Files:
cfe/trunk/include/clang/Sema/Scope.h
cfe/trunk/lib/Parse/ParseTemplate.cpp
cfe/trunk/lib/Sema/Scope.cpp
cfe/trunk/lib/Sema/SemaLambda.cpp
cfe/trunk/test/CXX/drs/dr1xx.cpp
cfe/trunk/test/CXX/temp/temp.arg/temp.arg.nontype/p1.cpp
cfe/trunk/test/SemaCXX/vartemplate-lambda.cpp
Index: cfe/trunk/include/clang/Sema/Scope.h
===================================================================
--- cfe/trunk/include/clang/Sema/Scope.h
+++ cfe/trunk/include/clang/Sema/Scope.h
@@ -197,6 +197,8 @@
/// this scope, or over-defined. The bit is true when over-defined.
llvm::PointerIntPair<VarDecl *, 1, bool> NRVO;
+ void setFlags(Scope *Parent, unsigned F);
+
public:
Scope(Scope *Parent, unsigned ScopeFlags, DiagnosticsEngine &Diag)
: ErrorTrap(Diag) {
@@ -206,7 +208,7 @@
/// getFlags - Return the flags for this scope.
///
unsigned getFlags() const { return Flags; }
- void setFlags(unsigned F) { Flags = F; }
+ void setFlags(unsigned F) { setFlags(getParent(), F); }
/// isBlockScope - Return true if this scope correspond to a closure.
bool isBlockScope() const { return Flags & BlockScope; }
Index: cfe/trunk/test/SemaCXX/vartemplate-lambda.cpp
===================================================================
--- cfe/trunk/test/SemaCXX/vartemplate-lambda.cpp
+++ cfe/trunk/test/SemaCXX/vartemplate-lambda.cpp
@@ -1,6 +1,9 @@
// RUN: %clang_cc1 -std=c++14 -fsyntax-only -verify %s
// expected-no-diagnostics
+template <class> auto fn0 = [] {};
+template <typename> void foo0() { fn0<char>(); }
+
template<typename T> auto fn1 = [](auto a) { return a + T(1); };
template <typename X>
Index: cfe/trunk/test/CXX/drs/dr1xx.cpp
===================================================================
--- cfe/trunk/test/CXX/drs/dr1xx.cpp
+++ cfe/trunk/test/CXX/drs/dr1xx.cpp
@@ -902,7 +902,11 @@
typedef int X;
};
template<> struct A<int> {
+#if __cplusplus <= 199711
+ typename B<int>::X x; // expected-error {{'typename' occurs outside of a template}}
+#else
typename B<int>::X x;
+#endif
};
}
Index: cfe/trunk/test/CXX/temp/temp.arg/temp.arg.nontype/p1.cpp
===================================================================
--- cfe/trunk/test/CXX/temp/temp.arg/temp.arg.nontype/p1.cpp
+++ cfe/trunk/test/CXX/temp/temp.arg/temp.arg.nontype/p1.cpp
@@ -195,7 +195,7 @@
namespace default_args {
#ifdef CPP11ONLY
namespace lambdas {
-template<int I = ([] { return 5; }())> //expected-error 2{{constant expression}} expected-note{{constant expression}}
+template<int I = ([] { return 5; }())> //expected-error {{constant expression}}
int f();
}
#endif // CPP11ONLY
Index: cfe/trunk/lib/Sema/SemaLambda.cpp
===================================================================
--- cfe/trunk/lib/Sema/SemaLambda.cpp
+++ cfe/trunk/lib/Sema/SemaLambda.cpp
@@ -814,9 +814,8 @@
// The lambda-expression's closure type might be dependent even if its
// semantic context isn't, if it appears within a default argument of a
// function template.
- if (Scope *TmplScope = CurScope->getTemplateParamParent())
- if (!TmplScope->decl_empty())
- KnownDependent = true;
+ if (CurScope->getTemplateParamParent())
+ KnownDependent = true;
// Determine the signature of the call operator.
TypeSourceInfo *MethodTyInfo;
Index: cfe/trunk/lib/Sema/Scope.cpp
===================================================================
--- cfe/trunk/lib/Sema/Scope.cpp
+++ cfe/trunk/lib/Sema/Scope.cpp
@@ -18,7 +18,7 @@
using namespace clang;
-void Scope::Init(Scope *parent, unsigned flags) {
+void Scope::setFlags(Scope *parent, unsigned flags) {
AnyParent = parent;
Flags = flags;
@@ -83,6 +83,10 @@
else
incrementMSManglingNumber();
}
+}
+
+void Scope::Init(Scope *parent, unsigned flags) {
+ setFlags(parent, flags);
DeclsInScope.clear();
UsingDirectives.clear();
Index: cfe/trunk/lib/Parse/ParseTemplate.cpp
===================================================================
--- cfe/trunk/lib/Parse/ParseTemplate.cpp
+++ cfe/trunk/lib/Parse/ParseTemplate.cpp
@@ -147,6 +147,9 @@
}
} while (Tok.isOneOf(tok::kw_export, tok::kw_template));
+ unsigned NewFlags = getCurScope()->getFlags() & ~Scope::TemplateParamScope;
+ ParseScopeFlags TemplateScopeFlags(this, NewFlags, isSpecialization);
+
// Parse the actual template declaration.
return ParseSingleDeclarationAfterTemplate(Context,
ParsedTemplateInfo(&ParamLists,
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits