Index: lib/Sema/SemaDecl.cpp =================================================================== --- lib/Sema/SemaDecl.cpp +++ lib/Sema/SemaDecl.cpp @@ -10091,7 +10091,8 @@ assert(Deduced && "deduceVarTypeFromInitializer for non-deduced type"); // C++11 [dcl.spec.auto]p3 - if (!Init) { + // Except for class argument deduction. + if (!Init && !isa(Deduced)) { assert(VDecl && "no init for init capture deduction?"); Diag(VDecl->getLocation(), diag::err_auto_var_requires_init) << VDecl->getDeclName() << Type; @@ -10110,7 +10111,10 @@ InitializationKind Kind = InitializationKind::CreateForInit( VDecl->getLocation(), DirectInit, Init); // FIXME: Initialization should not be taking a mutable list of inits. - SmallVector InitsCopy(DeduceInits.begin(), DeduceInits.end()); + SmallVector InitsCopy; + if (Init) + InitsCopy = {DeduceInits.begin(), DeduceInits.end()}; + return DeduceTemplateSpecializationFromInitializer(TSI, Entity, Kind, InitsCopy); } Index: test/CXX/dcl.dcl/dcl.spec/dcl.type/dcl.type.class.deduct/p1.cpp =================================================================== --- test/CXX/dcl.dcl/dcl.spec/dcl.type/dcl.type.class.deduct/p1.cpp +++ test/CXX/dcl.dcl/dcl.spec/dcl.type/dcl.type.class.deduct/p1.cpp @@ -5,8 +5,7 @@ A(int) -> A; static constexpr inline const volatile A a = {}; // ok, specifiers are permitted -// FIXME: There isn't really a good reason to reject this. -A b; // expected-error {{requires an initializer}} +A b; A c [[]] {}; A d = {}, e = {}; @@ -13,6 +12,6 @@ A f(0), g{}; // expected-error {{template arguments deduced as 'A' in declaration of 'f' and deduced as 'A' in declaration of 'g'}} struct B { - static A a; // expected-error {{requires an initializer}} + static A a; }; -extern A x; // expected-error {{requires an initializer}} +extern A x; Index: test/Parser/cxx1z-class-template-argument-deduction.cpp =================================================================== --- test/Parser/cxx1z-class-template-argument-deduction.cpp +++ test/Parser/cxx1z-class-template-argument-deduction.cpp @@ -52,7 +52,7 @@ operator A(); // expected-error {{requires template arguments; argument deduction not allowed in conversion function type}} - static A x; // expected-error {{declaration of variable 'x' with deduced type 'A' requires an initializer}} + static A x; static constexpr A y = 0; }; @@ -114,7 +114,6 @@ (void)A{n}; (void)new A(n); (void)new A{n}; - // FIXME: We should diagnose the lack of an initializer here. (void)new A; } } @@ -127,7 +126,7 @@ auto k() -> A; // expected-error{{requires template arguments}} - A a; // expected-error {{declaration of variable 'a' with deduced type 'A' requires an initializer}} + A a; A b = 0; const A c = 0; A (parens) = 0; // expected-error {{cannot use parentheses when declaring variable with deduced class template specialization type}}