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 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/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, 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/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/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 { +#if __cplusplus <= 199711 + typename B::X x; // expected-error {{'typename' occurs outside of a template}} +#else typename B::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 //expected-error 2{{constant expression}} expected-note{{constant expression}} +template //expected-error {{constant expression}} int f(); } #endif // CPP11ONLY 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 auto fn0 = [] {}; +template void foo0() { fn0(); } + template auto fn1 = [](auto a) { return a + T(1); }; template