// RUN: %clang_cc1 -std=c++17 -fms-compatibility -fsyntax-only -verify=before,expected %s // RUN: %clang_cc1 -std=c++17 -fms-compatibility -fdelayed-template-parsing -fsyntax-only -verify=before,expected %s // RUN: %clang_cc1 -std=c++20 -fms-compatibility -fsyntax-only -verify=after,expected %s // RUN: %clang_cc1 -std=c++20 -fms-compatibility -fdelayed-template-parsing -fsyntax-only -verify=after,expected %s template class Base { }; template class Based {}; // Trying to trick the typo detection template class Derived : public Base { public: // after-error@+1 {{member initializer 'Base' does not name a non-static data member or base class}} Derived() : Base() {} // before-warning {{unqualified base initializer of class templates is a Microsoft extension}} private: int Baze; // Trying to trick the typo detection }; template struct AggregateBase { T i; }; template struct AggregateDerived : public AggregateBase { int i; // after-error@+1 {{member initializer 'AggregateBase' does not name a non-static data member or base class}} AggregateDerived(T j) : AggregateBase{4}, i{j} {} // before-warning {{unqualified base initializer of class templates is a Microsoft extension}} int f() { return i + AggregateBase::i; // expected-warning {{use of undeclared identifier 'AggregateBase'; unqualified lookup into dependent bases of class template 'AggregateDerived' is a Microsoft extension}} } }; template struct MultiTypesBase { }; template struct MultiTypesDerived : public MultiTypesBase { // after-error@+1 {{member initializer 'MultiTypesBase' does not name a non-static data member or base class}} MultiTypesDerived() : MultiTypesBase{} {} // before-warning {{unqualified base initializer of class templates is a Microsoft extension}} }; template struct IntegerBase { }; template struct IntegerDerived : public IntegerBase { // after-error@+1 {{member initializer 'IntegerBase' does not name a non-static data member or base class}} IntegerDerived() : IntegerBase{} {} // before-warning {{unqualified base initializer of class templates is a Microsoft extension}} }; template struct ConformingBase { T i; }; template struct ConformingDerived : public ConformingBase { int i; ConformingDerived(T j) : ConformingBase{4}, i{j} {} int f() { return i + ConformingBase::i; } }; int main() { int I; Derived t; AggregateDerived AD{2}; AD.AggregateBase::i = 3; I = AD.f(); MultiTypesDerived MTD; IntegerDerived<4> ID; ConformingDerived CD{2}; I = CD.f(); return I; } template class Vec {}; // expected-note {{template is declared here}} template class Index : public Vec { // after-error@+1 {{member initializer 'Vec' does not name a non-static data member or base class}} Index() : Vec() {} // before-warning {{unqualified base initializer of class templates is a Microsoft extension}} }; template class Index<0>; template class Array : public Vec { // after-error@+1 {{member initializer 'Vec' does not name a non-static data member or base class}} Array() : Vec() {} // before-warning {{unqualified base initializer of class templates is a Microsoft extension}} }; template class Array; template class Wrong : public Vec { Wrong() : NonExistent() {} // expected-error {{member initializer 'NonExistent' does not name a non-static data member or base class}} }; template class Wrong; template class Wrong2 : public Vec { Wrong2() : Vec() {} // expected-error {{too few template arguments for class template 'Vec'}} }; template class Wrong2; template class Wrong3 : public Vec { Wrong3() : Base() {} // expected-error {{member initializer 'Base' does not name a non-static data member or base class}} }; template class Wrong3;