Index: lib/Frontend/CompilerInvocation.cpp =================================================================== --- lib/Frontend/CompilerInvocation.cpp +++ lib/Frontend/CompilerInvocation.cpp @@ -1618,9 +1618,12 @@ // Use the default target triple if unspecified. if (Opts.Triple.empty()) Opts.Triple = llvm::sys::getDefaultTargetTriple(); -} -// + // Use the MS ABI for Win32 targets unless otherwise specified. + if (Opts.CXXABI.empty() && + llvm::Triple(Opts.Triple).getOS() == llvm::Triple::Win32) + Opts.CXXABI = "microsoft"; +} bool CompilerInvocation::CreateFromArgs(CompilerInvocation &Res, const char *const *ArgBegin, Index: test/Analysis/inlining/dyn-dispatch-bifurcate.cpp =================================================================== --- test/Analysis/inlining/dyn-dispatch-bifurcate.cpp +++ test/Analysis/inlining/dyn-dispatch-bifurcate.cpp @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -analyze -analyzer-checker=core,debug.ExprInspection -analyzer-config ipa=dynamic-bifurcate -verify %s +// RUN: %clang_cc1 -analyze -analyzer-checker=core,debug.ExprInspection -analyzer-config ipa=dynamic-bifurcate -verify -Wno-reinterpret-base-class %s void clang_analyzer_eval(bool); Index: test/CXX/class.access/p4.cpp =================================================================== --- test/CXX/class.access/p4.cpp +++ test/CXX/class.access/p4.cpp @@ -1,4 +1,5 @@ -// RUN: %clang_cc1 -fcxx-exceptions -fexceptions -fsyntax-only -verify %s +// RUN: %clang_cc1 -fcxx-exceptions -fexceptions -fsyntax-only -cxx-abi itanium -verify %s +// RUN: %clang_cc1 -fcxx-exceptions -fexceptions -fsyntax-only -cxx-abi microsoft -DMSABI -verify %s // C++0x [class.access]p4: @@ -112,6 +113,9 @@ namespace test3 { class A { private: +#ifdef MSABI + // expected-note@+2 {{declared private here}} +#endif ~A(); // expected-note 2 {{declared private here}} static A foo; }; @@ -119,7 +123,10 @@ A a; // expected-error {{variable of type 'test3::A' has private destructor}} A A::foo; - void foo(A param) { // okay +#ifdef MSABI + // expected-error@+2 {{variable of type 'test3::A' has private destructor}} +#endif + void foo(A param) { // Okay in Itanium. A local; // expected-error {{variable of type 'test3::A' has private destructor}} } Index: test/CXX/dcl.dcl/dcl.link/p7.cpp =================================================================== --- test/CXX/dcl.dcl/dcl.link/p7.cpp +++ test/CXX/dcl.dcl/dcl.link/p7.cpp @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -emit-llvm -o - %s | FileCheck %s +// RUN: %clang_cc1 -cxx-abi itanium -emit-llvm -o - %s | FileCheck %s struct X { }; @@ -7,8 +7,6 @@ // CHECK: @x2 = external global %struct.X // CHECK: @x3 = external global %struct.X extern "C" { - - X x1; } Index: test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p2.cpp =================================================================== --- test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p2.cpp +++ test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p2.cpp @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -std=c++11 -emit-llvm %s -o - | FileCheck %s +// RUN: %clang_cc1 -std=c++11 -emit-llvm -cxx-abi itanium %s -o - | FileCheck %s // constexpr functions and constexpr constructors are implicitly inline. struct S { Index: test/CXX/drs/dr2xx.cpp =================================================================== --- test/CXX/drs/dr2xx.cpp +++ test/CXX/drs/dr2xx.cpp @@ -1,6 +1,10 @@ -// RUN: %clang_cc1 -std=c++98 %s -verify -fexceptions -fcxx-exceptions -pedantic-errors -// RUN: %clang_cc1 -std=c++11 %s -verify -fexceptions -fcxx-exceptions -pedantic-errors -// RUN: %clang_cc1 -std=c++1y %s -verify -fexceptions -fcxx-exceptions -pedantic-errors +// RUN: %clang_cc1 -std=c++98 %s -verify -fexceptions -fcxx-exceptions -pedantic-errors -cxx-abi itanium +// RUN: %clang_cc1 -std=c++11 %s -verify -fexceptions -fcxx-exceptions -pedantic-errors -cxx-abi itanium +// RUN: %clang_cc1 -std=c++1y %s -verify -fexceptions -fcxx-exceptions -pedantic-errors -cxx-abi itanium + +// RUN: %clang_cc1 -std=c++98 %s -verify -fexceptions -fcxx-exceptions -pedantic-errors -cxx-abi microsoft -DMSABI +// RUN: %clang_cc1 -std=c++11 %s -verify -fexceptions -fcxx-exceptions -pedantic-errors -cxx-abi microsoft -DMSABI +// RUN: %clang_cc1 -std=c++1y %s -verify -fexceptions -fcxx-exceptions -pedantic-errors -cxx-abi microsoft -DMSABI // PR13819 -- __SIZE_TYPE__ is incompatible. typedef __SIZE_TYPE__ size_t; // expected-error 0-1 {{extension}} @@ -534,17 +538,30 @@ namespace dr252 { // dr252: yes struct A { +#ifdef MSABI + // expected-note@+2 {{found}} +#endif void operator delete(void*); // expected-note {{found}} }; struct B { +#ifdef MSABI + // expected-note@+2 {{found}} +#endif void operator delete(void*); // expected-note {{found}} }; struct C : A, B { +#ifdef MSABI + // expected-error@+2 {{'operator delete' found in multiple base classes}} +#endif virtual ~C(); }; C::~C() {} // expected-error {{'operator delete' found in multiple base classes}} struct D { +#ifdef MSABI + // expected-note@+3 {{here}} MSABI + // expected-error@+3 {{no suitable member 'operator delete'}} +#endif void operator delete(void*, int); // expected-note {{here}} virtual ~D(); }; @@ -552,18 +569,22 @@ struct E { void operator delete(void*, int); - void operator delete(void*) = delete; // expected-error 0-1{{extension}} expected-note {{here}} - virtual ~E(); + void operator delete(void*) = delete; // expected-error 0-1{{extension}} expected-note 1-2 {{here}} + virtual ~E(); // expected-error 0-1 {{attempt to use a deleted function}} }; - E::~E() {} // expected-error {{deleted}} + E::~E() {} // expected-error {{attempt to use a deleted function}} struct F { // If both functions are available, the first one is a placement delete. void operator delete(void*, size_t); +#ifdef MSABI + // expected-note@+3 {{here}} + // expected-error@+3 {{attempt to use a deleted function}} +#endif void operator delete(void*) = delete; // expected-error 0-1{{extension}} expected-note {{here}} virtual ~F(); }; - F::~F() {} // expected-error {{deleted}} + F::~F() {} // expected-error {{attempt to use a deleted function}} struct G { void operator delete(void*, size_t); Index: test/CXX/special/class.copy/implicit-move-def.cpp =================================================================== --- test/CXX/special/class.copy/implicit-move-def.cpp +++ test/CXX/special/class.copy/implicit-move-def.cpp @@ -1,6 +1,6 @@ -// FIXME: %clang_cc1 -emit-llvm -o - -std=c++11 %s | FileCheck -check-prefix=CHECK %s -// RUN: %clang_cc1 -emit-llvm -o - -std=c++11 %s | FileCheck -check-prefix=CHECK-ASSIGN %s -// RUN: %clang_cc1 -emit-llvm -o - -std=c++11 %s | FileCheck -check-prefix=CHECK-CTOR %s +// FIXME: %clang_cc1 -emit-llvm -cxx-abi itanium -o - -std=c++11 %s | FileCheck -check-prefix=CHECK %s +// RUN: %clang_cc1 -emit-llvm -cxx-abi itanium -o - -std=c++11 %s | FileCheck -check-prefix=CHECK-ASSIGN %s +// RUN: %clang_cc1 -emit-llvm -cxx-abi itanium -o - -std=c++11 %s | FileCheck -check-prefix=CHECK-CTOR %s // construct Index: test/CXX/special/class.dtor/p3-0x.cpp =================================================================== --- test/CXX/special/class.dtor/p3-0x.cpp +++ test/CXX/special/class.dtor/p3-0x.cpp @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -std=c++11 -fexceptions -fcxx-exceptions -emit-llvm -o - %s | FileCheck %s +// RUN: %clang_cc1 -std=c++11 -cxx-abi itanium -fexceptions -fcxx-exceptions -emit-llvm -o - %s | FileCheck %s struct A { ~A(); Index: test/CXX/special/class.dtor/p5-0x.cpp =================================================================== --- test/CXX/special/class.dtor/p5-0x.cpp +++ test/CXX/special/class.dtor/p5-0x.cpp @@ -1,4 +1,5 @@ -// RUN: %clang_cc1 -verify -std=c++11 %s +// RUN: %clang_cc1 -verify -cxx-abi itanium -std=c++11 %s +// RUN: %clang_cc1 -verify -cxx-abi microsoft -DMSABI -std=c++11 %s struct NonTrivDtor { ~NonTrivDtor(); @@ -94,6 +95,13 @@ // expected-error {{deleted function '~D2' cannot override a non-deleted}} // implicitly-virtual destructor } d2; // expected-error {{deleted function}} +#ifdef MSABI +// expected-error@+7 {{no suitable member 'operator delete' in 'D3'}} +// expected-note@+7 {{member 'operator delete' declared here}} +// expected-note@+7 {{member 'operator delete' declared here}} +// expected-error@+9 {{attempt to use a deleted function}} +// expected-note@+9 {{function has been explicitly marked deleted here}} +#endif struct D3 { // expected-note {{virtual destructor requires an unambiguous, accessible 'operator delete'}} virtual ~D3() = default; // expected-note {{explicitly defaulted function was implicitly deleted here}} void operator delete(void*, double = 0.0); Index: test/CXX/special/class.dtor/p9.cpp =================================================================== --- test/CXX/special/class.dtor/p9.cpp +++ test/CXX/special/class.dtor/p9.cpp @@ -1,4 +1,5 @@ -// RUN: %clang_cc1 -fsyntax-only -verify %s +// RUN: %clang_cc1 -fsyntax-only -cxx-abi itanium -verify %s +// RUN: %clang_cc1 -fsyntax-only -cxx-abi microsoft -DMSABI -verify %s typedef typeof(sizeof(int)) size_t; @@ -28,12 +29,18 @@ namespace test1 { class A { public: +#ifdef MSABI + // expected-note@+2 {{declared here}} +#endif static void operator delete(void *p) {}; // expected-note {{member 'operator delete' declared here}} virtual ~A(); }; class B : protected A { public: +#ifdef MSABI + // expected-note@+2 {{declared here}} +#endif static void operator delete(void *, size_t) {}; // expected-note {{member 'operator delete' declared here}} ~B(); }; @@ -43,6 +50,9 @@ using A::operator delete; using B::operator delete; +#ifdef MSABI + // expected-error@+2 {{multiple suitable 'operator delete' functions in 'C'}} +#endif ~C(); }; @@ -52,12 +62,22 @@ // ...at the point of definition of a virtual destructor... namespace test2 { struct A { +#ifdef MSABI + // expected-error@+3 {{no suitable member 'operator delete' in 'A'}} + // expected-note@+3 {{declared here}} +#endif virtual ~A(); static void operator delete(void*, const int &); }; struct B { +#ifdef MSABI + // expected-error@+2 {{no suitable member 'operator delete' in 'B'}} +#endif virtual ~B(); +#ifdef MSABI + // expected-note@+2 {{declared here}} +#endif static void operator delete(void*, const int &); // expected-note {{declared here}} }; B::~B() {} // expected-error {{no suitable member 'operator delete' in 'B'}} @@ -74,7 +94,13 @@ // PR7346 namespace test3 { struct A { +#ifdef MSABI + // expected-error@+2 {{no suitable member 'operator delete' in 'A'}} +#endif virtual ~A(); +#ifdef MSABI + // expected-note@+2 {{declared here}} +#endif static void operator delete(void*, const int &); }; Index: test/CodeGen/builtin-ms-noop.cpp =================================================================== --- test/CodeGen/builtin-ms-noop.cpp +++ test/CodeGen/builtin-ms-noop.cpp @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -fms-extensions -triple i686-pc-win32 -emit-llvm %s -o - | FileCheck %s +// RUN: %clang_cc1 -fms-extensions -triple i686-pc-win32 -cxx-abi itanium -emit-llvm %s -o - | FileCheck %s class A { public: @@ -11,4 +11,3 @@ // CHECK: ret void __noop(A()); }; - Index: test/CodeGen/captured-statements.c =================================================================== --- test/CodeGen/captured-statements.c +++ test/CodeGen/captured-statements.c @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -emit-llvm %s -o %t +// RUN: %clang_cc1 -cxx-abi itanium -emit-llvm %s -o %t // RUN: FileCheck %s -input-file=%t -check-prefix=CHECK-GLOBALS // RUN: FileCheck %s -input-file=%t -check-prefix=CHECK-1 // RUN: FileCheck %s -input-file=%t -check-prefix=CHECK-2 Index: test/CodeGen/complex-convert.c =================================================================== --- test/CodeGen/complex-convert.c +++ test/CodeGen/complex-convert.c @@ -22,9 +22,14 @@ _Complex signed long long csll1; _Complex unsigned long long cull1; // CHECK-LABEL: define void @foo( - // CHECK: alloca i[[CHSIZE:[0-9]+]], align [[CHALIGN:[0-9]+]] - // CHECK-NEXT: alloca i[[CHSIZE]], align [[CHALIGN]] - // CHECK-NEXT: alloca i[[LLSIZE:[0-9]+]], align [[LLALIGN:[0-9]+]] + // Match the prototype to pick up the size of sc and sll. + // CHECK: i[[CHSIZE:[0-9]+]]{{[^,]*}}, + // CHECK: i[[CHSIZE]]{{[^,]*}}, + // CHECK: i[[LLSIZE:[0-9]+]] + + // Match against the allocas to pick up the alignments. + // CHECK: alloca i[[CHSIZE]], align [[CHALIGN:[0-9]+]] + // CHECK: alloca i[[LLSIZE]], align [[LLALIGN:[0-9]+]] sc1 = csc; // CHECK: %[[VAR1:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }* %[[CSC:[A-Za-z0-9.]+]], i{{[0-9]+}} 0, i{{[0-9]+}} 0 Index: test/CodeGen/cxx-default-arg.cpp =================================================================== --- test/CodeGen/cxx-default-arg.cpp +++ test/CodeGen/cxx-default-arg.cpp @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -emit-llvm %s -o %t +// RUN: %clang_cc1 -cxx-abi itanium -emit-llvm %s -o %t // Note-LABEL: define CLANG_GENERATE_KNOWN_GOOD and compile to generate code // that makes all of the defaulted arguments explicit. The resulting Index: test/CodeGen/fp-contract-pragma.cpp =================================================================== --- test/CodeGen/fp-contract-pragma.cpp +++ test/CodeGen/fp-contract-pragma.cpp @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -O3 -emit-llvm -o - %s | FileCheck %s +// RUN: %clang_cc1 -O3 -cxx-abi itanium -emit-llvm -o - %s | FileCheck %s // Is FP_CONTRACT is honored in a simple case? float fp_contract_1(float a, float b, float c) { Index: test/CodeGen/overloadable.c =================================================================== --- test/CodeGen/overloadable.c +++ test/CodeGen/overloadable.c @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -emit-llvm %s -o - | grep _Z1fPA10_1X +// RUN: %clang_cc1 -cxx-abi itanium -emit-llvm %s -o - | grep _Z1fPA10_1X int __attribute__((overloadable)) f(int x) { return x; } float __attribute__((overloadable)) f(float x) { return x; } double __attribute__((overloadable)) f(double x) { return x; } Index: test/CodeGen/tbaa-for-vptr.cpp =================================================================== --- test/CodeGen/tbaa-for-vptr.cpp +++ test/CodeGen/tbaa-for-vptr.cpp @@ -1,9 +1,9 @@ -// RUN: %clang_cc1 -emit-llvm -o - -fsanitize=thread %s | FileCheck %s -// RUN: %clang_cc1 -emit-llvm -o - -O1 %s | FileCheck %s -// RUN: %clang_cc1 -emit-llvm -o - -O1 -relaxed-aliasing -fsanitize=thread %s | FileCheck %s +// RUN: %clang_cc1 -cxx-abi itanium -emit-llvm -o - -fsanitize=thread %s | FileCheck %s +// RUN: %clang_cc1 -cxx-abi itanium -emit-llvm -o - -O1 %s | FileCheck %s +// RUN: %clang_cc1 -cxx-abi itanium -emit-llvm -o - -O1 -relaxed-aliasing -fsanitize=thread %s | FileCheck %s // -// RUN: %clang_cc1 -emit-llvm -o - %s | FileCheck %s --check-prefix=NOTBAA -// RUN: %clang_cc1 -emit-llvm -o - -O2 -relaxed-aliasing %s | FileCheck %s --check-prefix=NOTBAA +// RUN: %clang_cc1 -cxx-abi itanium -emit-llvm -o - %s | FileCheck %s --check-prefix=NOTBAA +// RUN: %clang_cc1 -cxx-abi itanium -emit-llvm -o - -O2 -relaxed-aliasing %s | FileCheck %s --check-prefix=NOTBAA // // Check that we generate TBAA for vtable pointer loads and stores. // When -fthread-sanitizer is used TBAA should be generated at all opt levels Index: test/CodeGenCUDA/filter-decl.cu =================================================================== --- test/CodeGenCUDA/filter-decl.cu +++ test/CodeGenCUDA/filter-decl.cu @@ -1,5 +1,5 @@ -// RUN: %clang_cc1 -emit-llvm %s -o - | FileCheck -check-prefix=CHECK-HOST %s -// RUN: %clang_cc1 -emit-llvm %s -o - -fcuda-is-device | FileCheck -check-prefix=CHECK-DEVICE %s +// RUN: %clang_cc1 -cxx-abi itanium -emit-llvm %s -o - | FileCheck -check-prefix=CHECK-HOST %s +// RUN: %clang_cc1 -cxx-abi itanium -emit-llvm %s -o - -fcuda-is-device | FileCheck -check-prefix=CHECK-DEVICE %s #include "../SemaCUDA/cuda.h" Index: test/CodeGenObjC/debug-info-self.m =================================================================== --- test/CodeGenObjC/debug-info-self.m +++ test/CodeGenObjC/debug-info-self.m @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -emit-llvm -g %s -o - | FileCheck %s +// RUN: %clang_cc1 -emit-llvm -cxx-abi itanium -g %s -o - | FileCheck %s // self and _cmd are marked as DW_AT_artificial. // myarg is not marked as DW_AT_artificial. Index: test/CodeGenObjC/overloadable.m =================================================================== --- test/CodeGenObjC/overloadable.m +++ test/CodeGenObjC/overloadable.m @@ -1,10 +1,12 @@ // rdar://6657613 -// RUN: %clang_cc1 -emit-llvm %s -o %t +// RUN: %clang_cc1 -cxx-abi itanium -emit-llvm %s -o - | FileCheck %s @class C; -// RUN: grep _Z1fP11objc_object %t | count 1 +// CHECK: _Z1fP11objc_object +// CHECK-NOT: _Z1fP11objc_object void __attribute__((overloadable)) f(id c) { } -// RUN: grep _Z1fP1C %t | count 1 +// CHECK: _Z1fP1C +// CHECK-NOT: _Z1fP1C void __attribute__((overloadable)) f(C *c) { } Index: test/CodeGenObjCXX/arc-mangle.mm =================================================================== --- test/CodeGenObjCXX/arc-mangle.mm +++ test/CodeGenObjCXX/arc-mangle.mm @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -fobjc-arc -fobjc-runtime-has-weak -emit-llvm -o - %s | FileCheck %s +// RUN: %clang_cc1 -fobjc-arc -fobjc-runtime-has-weak -cxx-abi itanium -emit-llvm -o - %s | FileCheck %s // CHECK-LABEL: define void @_Z1fPU8__strongP11objc_object(i8**) void f(__strong id *) {} Index: test/CodeGenOpenCL/address-spaces-mangling.cl =================================================================== --- test/CodeGenOpenCL/address-spaces-mangling.cl +++ test/CodeGenOpenCL/address-spaces-mangling.cl @@ -1,5 +1,5 @@ -// RUN: %clang_cc1 %s -ffake-address-space-map -faddress-space-map-mangling=yes -emit-llvm -o - | FileCheck -check-prefix=ASMANG %s -// RUN: %clang_cc1 %s -ffake-address-space-map -faddress-space-map-mangling=no -emit-llvm -o - | FileCheck -check-prefix=NOASMANG %s +// RUN: %clang_cc1 %s -ffake-address-space-map -faddress-space-map-mangling=yes -cxx-abi itanium -emit-llvm -o - | FileCheck -check-prefix=ASMANG %s +// RUN: %clang_cc1 %s -ffake-address-space-map -faddress-space-map-mangling=no -cxx-abi itanium -emit-llvm -o - | FileCheck -check-prefix=NOASMANG %s // We can't name this f as private is equivalent to default // no specifier given address space so we get multiple definition Index: test/CodeGenOpenCL/local.cl =================================================================== --- test/CodeGenOpenCL/local.cl +++ test/CodeGenOpenCL/local.cl @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 %s -ffake-address-space-map -faddress-space-map-mangling=no -emit-llvm -o - | FileCheck %s +// RUN: %clang_cc1 %s -ffake-address-space-map -faddress-space-map-mangling=no -cxx-abi itanium -emit-llvm -o - | FileCheck %s __kernel void foo(void) { // CHECK: @foo.i = internal addrspace(2) Index: test/PCH/cxx-reference.cpp =================================================================== --- test/PCH/cxx-reference.cpp +++ test/PCH/cxx-reference.cpp @@ -1,6 +1,6 @@ // Test this without pch. -// RUN: %clang_cc1 -x c++ -std=c++11 -include %S/cxx-reference.h -fsyntax-only -emit-llvm -o - %s +// RUN: %clang_cc1 -x c++ -cxx-abi itanium -std=c++11 -include %S/cxx-reference.h -fsyntax-only -emit-llvm -o - %s // Test with pch. -// RUN: %clang_cc1 -x c++ -std=c++11 -emit-pch -o %t %S/cxx-reference.h -// RUN: %clang_cc1 -x c++ -std=c++11 -include-pch %t -fsyntax-only -emit-llvm -o - %s +// RUN: %clang_cc1 -x c++ -cxx-abi itanium -std=c++11 -emit-pch -o %t %S/cxx-reference.h +// RUN: %clang_cc1 -x c++ -cxx-abi itanium -std=c++11 -include-pch %t -fsyntax-only -emit-llvm -o - %s Index: test/PCH/cxx-required-decls.cpp =================================================================== --- test/PCH/cxx-required-decls.cpp +++ test/PCH/cxx-required-decls.cpp @@ -1,9 +1,9 @@ // Test this without pch. -// RUN: %clang_cc1 -include %S/cxx-required-decls.h %s -emit-llvm -o - | FileCheck %s +// RUN: %clang_cc1 -include %S/cxx-required-decls.h %s -cxx-abi itanium -emit-llvm -o - | FileCheck %s // Test with pch. -// RUN: %clang_cc1 -x c++-header -emit-pch -o %t %S/cxx-required-decls.h -// RUN: %clang_cc1 -include-pch %t %s -emit-llvm -o - | FileCheck %s +// RUN: %clang_cc1 -x c++-header -cxx-abi itanium -emit-pch -o %t %S/cxx-required-decls.h +// RUN: %clang_cc1 -include-pch %t %s -cxx-abi itanium -emit-llvm -o - | FileCheck %s // CHECK: @_ZL5globS = internal global %struct.S zeroinitializer // CHECK: @_ZL3bar = internal global i32 0, align 4 Index: test/PCH/cxx-templates.cpp =================================================================== --- test/PCH/cxx-templates.cpp +++ test/PCH/cxx-templates.cpp @@ -1,21 +1,21 @@ // Test this without pch. -// RUN: %clang_cc1 -std=c++11 -fcxx-exceptions -fexceptions -include %S/cxx-templates.h -verify %s -ast-dump -o - -// RUN: %clang_cc1 -std=c++11 -fcxx-exceptions -fexceptions -include %S/cxx-templates.h %s -emit-llvm -o - -DNO_ERRORS | FileCheck %s +// RUN: %clang_cc1 -std=c++11 -cxx-abi itanium -fcxx-exceptions -fexceptions -include %S/cxx-templates.h -verify %s -ast-dump -o - +// RUN: %clang_cc1 -std=c++11 -cxx-abi itanium -fcxx-exceptions -fexceptions -include %S/cxx-templates.h %s -emit-llvm -o - -DNO_ERRORS | FileCheck %s // Test with pch. -// RUN: %clang_cc1 -std=c++11 -fcxx-exceptions -fexceptions -x c++-header -emit-pch -o %t %S/cxx-templates.h -// RUN: %clang_cc1 -std=c++11 -fcxx-exceptions -fexceptions -include-pch %t -verify %s -ast-dump -o - -// RUN: %clang_cc1 -std=c++11 -fcxx-exceptions -fexceptions -include-pch %t %s -emit-llvm -o - -error-on-deserialized-decl doNotDeserialize -DNO_ERRORS | FileCheck %s +// RUN: %clang_cc1 -std=c++11 -cxx-abi itanium -fcxx-exceptions -fexceptions -x c++-header -emit-pch -o %t %S/cxx-templates.h +// RUN: %clang_cc1 -std=c++11 -cxx-abi itanium -fcxx-exceptions -fexceptions -include-pch %t -verify %s -ast-dump -o - +// RUN: %clang_cc1 -std=c++11 -cxx-abi itanium -fcxx-exceptions -fexceptions -include-pch %t %s -emit-llvm -o - -error-on-deserialized-decl doNotDeserialize -DNO_ERRORS | FileCheck %s // Test with modules. -// RUN: %clang_cc1 -std=c++11 -fcxx-exceptions -fexceptions -fmodules -x c++-header -emit-pch -o %t %S/cxx-templates.h -// RUN: %clang_cc1 -std=c++11 -fcxx-exceptions -fexceptions -fmodules -include-pch %t -verify %s -ast-dump -o - -// RUN: %clang_cc1 -std=c++11 -fcxx-exceptions -fexceptions -fmodules -include-pch %t %s -emit-llvm -o - -error-on-deserialized-decl doNotDeserialize -DNO_ERRORS | FileCheck %s +// RUN: %clang_cc1 -std=c++11 -cxx-abi itanium -fcxx-exceptions -fexceptions -fmodules -x c++-header -emit-pch -o %t %S/cxx-templates.h +// RUN: %clang_cc1 -std=c++11 -cxx-abi itanium -fcxx-exceptions -fexceptions -fmodules -include-pch %t -verify %s -ast-dump -o - +// RUN: %clang_cc1 -std=c++11 -cxx-abi itanium -fcxx-exceptions -fexceptions -fmodules -include-pch %t %s -emit-llvm -o - -error-on-deserialized-decl doNotDeserialize -DNO_ERRORS | FileCheck %s // Test with pch and delayed template parsing. -// RUN: %clang_cc1 -std=c++11 -fcxx-exceptions -fdelayed-template-parsing -fexceptions -x c++-header -emit-pch -o %t %S/cxx-templates.h -// RUN: %clang_cc1 -std=c++11 -fcxx-exceptions -fdelayed-template-parsing -fexceptions -include-pch %t -verify %s -ast-dump -o - -// RUN: %clang_cc1 -std=c++11 -fcxx-exceptions -fdelayed-template-parsing -fexceptions -include-pch %t %s -emit-llvm -o - -DNO_ERRORS | FileCheck %s +// RUN: %clang_cc1 -std=c++11 -cxx-abi itanium -fcxx-exceptions -fdelayed-template-parsing -fexceptions -x c++-header -emit-pch -o %t %S/cxx-templates.h +// RUN: %clang_cc1 -std=c++11 -cxx-abi itanium -fcxx-exceptions -fdelayed-template-parsing -fexceptions -include-pch %t -verify %s -ast-dump -o - +// RUN: %clang_cc1 -std=c++11 -cxx-abi itanium -fcxx-exceptions -fdelayed-template-parsing -fexceptions -include-pch %t %s -emit-llvm -o - -DNO_ERRORS | FileCheck %s // CHECK: define weak_odr {{.*}}void @_ZN2S4IiE1mEv // CHECK: define linkonce_odr {{.*}}void @_ZN2S3IiE1mEv Index: test/PCH/irgen-rdar13114142.mm =================================================================== --- test/PCH/irgen-rdar13114142.mm +++ test/PCH/irgen-rdar13114142.mm @@ -1,5 +1,5 @@ -// RUN: %clang_cc1 %s -emit-pch -o %t.pch -// RUN: %clang_cc1 %s -emit-llvm -include-pch %t.pch -o - | FileCheck %s +// RUN: %clang_cc1 %s -cxx-abi itanium -emit-pch -o %t.pch +// RUN: %clang_cc1 %s -cxx-abi itanium -emit-llvm -include-pch %t.pch -o - | FileCheck %s #ifndef HEADER #define HEADER Index: test/PCH/objc_literals.mm =================================================================== --- test/PCH/objc_literals.mm +++ test/PCH/objc_literals.mm @@ -1,7 +1,7 @@ -// RUN: %clang_cc1 -emit-pch -x objective-c++ -std=c++0x -o %t %s -// RUN: %clang_cc1 -include-pch %t -x objective-c++ -std=c++0x -verify %s -// RUN: %clang_cc1 -include-pch %t -x objective-c++ -std=c++0x -ast-print %s | FileCheck -check-prefix=CHECK-PRINT %s -// RUN: %clang_cc1 -include-pch %t -x objective-c++ -std=c++0x -emit-llvm -o - %s | FileCheck -check-prefix=CHECK-IR %s +// RUN: %clang_cc1 -cxx-abi itanium -emit-pch -x objective-c++ -std=c++0x -o %t %s +// RUN: %clang_cc1 -cxx-abi itanium -include-pch %t -x objective-c++ -std=c++0x -verify %s +// RUN: %clang_cc1 -cxx-abi itanium -include-pch %t -x objective-c++ -std=c++0x -ast-print %s | FileCheck -check-prefix=CHECK-PRINT %s +// RUN: %clang_cc1 -cxx-abi itanium -include-pch %t -x objective-c++ -std=c++0x -emit-llvm -o - %s | FileCheck -check-prefix=CHECK-IR %s // expected-no-diagnostics Index: test/PCH/objcxx-ivar-class.mm =================================================================== --- test/PCH/objcxx-ivar-class.mm +++ test/PCH/objcxx-ivar-class.mm @@ -1,9 +1,9 @@ // Test this without pch. -// RUN: not %clang_cc1 -include %S/objcxx-ivar-class.h -verify %s -emit-llvm -o - | FileCheck %s +// RUN: %clang_cc1 -include %S/objcxx-ivar-class.h -cxx-abi itanium %s -emit-llvm -o - | FileCheck %s // Test with pch. -// RUN: %clang_cc1 -x objective-c++-header -emit-pch -o %t %S/objcxx-ivar-class.h -// RUN: not %clang_cc1 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s +// RUN: %clang_cc1 -x objective-c++-header -cxx-abi itanium -emit-pch -o %t %S/objcxx-ivar-class.h +// RUN: %clang_cc1 -include-pch %t -cxx-abi itanium %s -emit-llvm -o - | FileCheck %s // CHECK: [C position] // CHECK: call {{.*}} @_ZN1SC1ERKS_ Index: test/Sema/empty1.c =================================================================== --- test/Sema/empty1.c +++ test/Sema/empty1.c @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 %s -fsyntax-only -verify -Wc++-compat +// RUN: %clang_cc1 %s -cxx-abi itanium -fsyntax-only -verify -Wc++-compat struct emp_1 { // expected-warning {{empty struct has size 0 in C, size 1 in C++}} }; Index: test/SemaCXX/deleted-operator.cpp =================================================================== --- test/SemaCXX/deleted-operator.cpp +++ test/SemaCXX/deleted-operator.cpp @@ -13,6 +13,7 @@ } struct DelOpDel { - virtual ~DelOpDel() {} // expected-error {{deleted function}} - void operator delete(void*) = delete; // expected-note {{deleted here}} + // FIXME: In MS ABI, we error twice below. + virtual ~DelOpDel() {} // expected-error 1-2 {{attempt to use a deleted function}} + void operator delete(void*) = delete; // expected-note 1-2 {{deleted here}} }; Index: test/SemaCXX/destructor.cpp =================================================================== --- test/SemaCXX/destructor.cpp +++ test/SemaCXX/destructor.cpp @@ -1,4 +1,5 @@ -// RUN: %clang_cc1 -std=c++11 -fsyntax-only -Wnon-virtual-dtor -Wdelete-non-virtual-dtor -verify %s +// RUN: %clang_cc1 -std=c++11 -cxx-abi itanium -fsyntax-only -Wnon-virtual-dtor -Wdelete-non-virtual-dtor -verify %s +// RUN: %clang_cc1 -std=c++11 -cxx-abi microsoft -DMSABI -fsyntax-only -Wnon-virtual-dtor -Wdelete-non-virtual-dtor -verify %s class A { public: ~A(); @@ -83,6 +84,14 @@ } namespace PR6709 { +#ifdef MSABI + // This bug, "Clang instantiates destructor for function argument" is intended + // behaviour in the Microsoft ABI because the callee needs to destruct the arguments. + // expected-error@+5 {{indirection requires pointer operand ('int' invalid)}} + // expected-note@+4 {{implicitly declared private here}} + // expected-error@+4 {{variable of type 'X' has private destructor}} + // expected-note@+3 {{in instantiation of member function 'PR6709::X::~X' requested here}} +#endif template class X { T v; ~X() { ++*v; } }; void a(X x) {} } @@ -100,10 +109,16 @@ T::deleteIt(p); // expected-error {{type 'int' cannot be used prior to '::'}} } +#ifdef MSABI + // expected-note@+2 {{in instantiation of member function 'test6::A::operator delete' requested here}} +#endif virtual ~A() {} }; - class B : A { B(); }; // expected-note {{in instantiation of member function 'test6::A::operator delete' requested here}} +#ifndef MSABI + // expected-note@+2 {{in instantiation of member function 'test6::A::operator delete' requested here}} +#endif + class B : A { B(); }; B::B() {} } Index: test/SemaCXX/implicit-virtual-member-functions.cpp =================================================================== --- test/SemaCXX/implicit-virtual-member-functions.cpp +++ test/SemaCXX/implicit-virtual-member-functions.cpp @@ -1,15 +1,19 @@ -// RUN: %clang_cc1 -fsyntax-only -verify %s +// RUN: %clang_cc1 -fsyntax-only -cxx-abi itanium -verify %s +// RUN: %clang_cc1 -fsyntax-only -cxx-abi microsoft -DMSABI -verify %s struct A { virtual ~A(); }; -struct B : A { // expected-error {{no suitable member 'operator delete' in 'B'}} +#ifndef MSABI +// expected-error@+4 {{no suitable member 'operator delete' in 'B'}} +// expected-note@+5 {{'operator delete' declared here}} +// expected-note@+6 {{implicit destructor for 'B' first required here}} +#endif +struct B : A { virtual void f(); - - void operator delete (void *, int); // expected-note {{'operator delete' declared here}} + void operator delete (void *, int); }; - -void B::f() { // expected-note {{implicit destructor for 'B' first required here}} +void B::f() { } struct C : A { // expected-error {{no suitable member 'operator delete' in 'C'}} Index: test/SemaCXX/primary-base.cpp =================================================================== --- test/SemaCXX/primary-base.cpp +++ test/SemaCXX/primary-base.cpp @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -fsyntax-only -verify %s +// RUN: %clang_cc1 -cxx-abi itanium -fsyntax-only -verify %s // expected-no-diagnostics class A { virtual void f(); }; class B : virtual A { }; Index: test/SemaCXX/typeid-ref.cpp =================================================================== --- test/SemaCXX/typeid-ref.cpp +++ test/SemaCXX/typeid-ref.cpp @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -emit-llvm -o - %s | FileCheck %s +// RUN: %clang_cc1 -cxx-abi itanium -emit-llvm -o - %s | FileCheck %s namespace std { class type_info; } Index: test/SemaCXX/undefined-internal.cpp =================================================================== --- test/SemaCXX/undefined-internal.cpp +++ test/SemaCXX/undefined-internal.cpp @@ -1,7 +1,7 @@ // RUN: %clang_cc1 -fsyntax-only -verify %s // Make sure we don't produce invalid IR. -// RUN: %clang_cc1 -emit-llvm-only %s +// RUN: %clang_cc1 -cxx-abi itanium -emit-llvm-only %s namespace test1 { static void foo(); // expected-warning {{function 'test1::foo' has internal linkage but is not defined}} Index: test/SemaCXX/virtual-base-used.cpp =================================================================== --- test/SemaCXX/virtual-base-used.cpp +++ test/SemaCXX/virtual-base-used.cpp @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -fsyntax-only -verify %s +// RUN: %clang_cc1 -fsyntax-only -cxx-abi itanium -verify %s // PR7800 class NoDestroy { ~NoDestroy(); }; // expected-note 3 {{declared private here}} Index: test/SemaCXX/warn-reinterpret-base-class.cpp =================================================================== --- test/SemaCXX/warn-reinterpret-base-class.cpp +++ test/SemaCXX/warn-reinterpret-base-class.cpp @@ -1,5 +1,8 @@ -// RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify -Wreinterpret-base-class -Wno-unused-volatile-lvalue %s -// RUN: not %clang_cc1 -std=c++11 -fsyntax-only -fdiagnostics-parseable-fixits -Wreinterpret-base-class -Wno-unused-volatile-lvalue %s 2>&1 | FileCheck %s +// RUN: %clang_cc1 -std=c++11 -fsyntax-only -cxx-abi itanium -verify -Wreinterpret-base-class -Wno-unused-volatile-lvalue %s +// RUN: %clang_cc1 -std=c++11 -fsyntax-only -cxx-abi microsoft -DMSABI -verify -Wreinterpret-base-class -Wno-unused-volatile-lvalue %s + +// RUN: not %clang_cc1 -std=c++11 -fsyntax-only -cxx-abi itanium -fdiagnostics-parseable-fixits -Wreinterpret-base-class -Wno-unused-volatile-lvalue %s 2>&1 | FileCheck %s +// RUN: not %clang_cc1 -std=c++11 -fsyntax-only -cxx-abi microsoft -fdiagnostics-parseable-fixits -Wreinterpret-base-class -Wno-unused-volatile-lvalue %s 2>&1 | FileCheck %s // PR 13824 class A { @@ -288,6 +291,11 @@ (void)reinterpret_cast(f); // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:9-[[@LINE-1]]:25}:"static_cast" +#ifdef MSABI + // In MS ABI mode, A is at non-zero offset in H. + // expected-warning@+3 {{'reinterpret_cast' to class 'H *' from its base at non-zero offset 'A *' behaves differently from 'static_cast'}} + // expected-note@+2 {{use 'static_cast'}} +#endif (void)reinterpret_cast(a); // expected-warning@+2 {{'reinterpret_cast' to class 'L' (aka 'const F *volatile') from its base at non-zero offset 'E *' behaves differently from 'static_cast'}} @@ -309,6 +317,12 @@ // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:9-[[@LINE-1]]:25}:"static_cast" (void)reinterpret_cast(h); + +#ifdef MSABI + // In MS ABI mode, A is at non-zero offset in H. + // expected-warning@+3 {{'reinterpret_cast' from class 'H *' to its base at non-zero offset 'A *' behaves differently from 'static_cast'}} + // expected-note@+2 {{use 'static_cast'}} +#endif (void)reinterpret_cast(h); // expected-warning@+2 {{'reinterpret_cast' from class 'I *' to its virtual base 'F *' behaves differently from 'static_cast'}} Index: test/SemaCXX/warn-weak-vtables.cpp =================================================================== --- test/SemaCXX/warn-weak-vtables.cpp +++ test/SemaCXX/warn-weak-vtables.cpp @@ -1,4 +1,5 @@ -// RUN: %clang_cc1 %s -fsyntax-only -verify -Wweak-vtables -Wweak-template-vtables +// RUN: %clang_cc1 %s -fsyntax-only -verify -cxx-abi itanium -Wweak-vtables -Wweak-template-vtables +// RUN: %clang_cc1 %s -fsyntax-only -cxx-abi microsoft -Wno-weak-vtables -Wno-weak-template-vtables struct A { // expected-warning {{'A' has no out-of-line virtual method definitions; its vtable will be emitted in every translation unit}} virtual void f() { } Index: test/SemaTemplate/inject-templated-friend-post.cpp =================================================================== --- test/SemaTemplate/inject-templated-friend-post.cpp +++ test/SemaTemplate/inject-templated-friend-post.cpp @@ -1,12 +1,17 @@ -// RUN: %clang %s -std=c++98 -S -emit-llvm -o - | grep -e "define linkonce_odr.*_ZlsR11std_ostreamRK8StreamerI3FooE" -// RUN: %clang %s -std=c++98 -S -emit-llvm -o - -DPROTOTYPE | grep -e "define linkonce_odr.*_ZlsR11std_ostreamRK8StreamerI3FooE" -// RUN: %clang %s -std=c++98 -S -emit-llvm -o - -DINSTANTIATE | grep -e "define linkonce_odr.*_ZlsR11std_ostreamRK8StreamerI3FooE" -// RUN: %clang %s -std=c++98 -S -emit-llvm -o - -DPROTOTYPE -DINSTANTIATE | grep -e "define linkonce_odr.*_ZlsR11std_ostreamRK8StreamerI3FooE" +// RUN: %clang_cc1 %s -std=c++98 -cxx-abi itanium -emit-llvm -o - | FileCheck %s +// RUN: %clang_cc1 %s -std=c++98 -cxx-abi itanium -emit-llvm -o - -DPROTOTYPE | FileCheck --check-prefix=CHECK-PROTOTYPE %s +// RUN: %clang_cc1 %s -std=c++98 -cxx-abi itanium -emit-llvm -o - -DINSTANTIATE | FileCheck --check-prefix=CHECK-INSTANTIATE %s +// RUN: %clang_cc1 %s -std=c++98 -cxx-abi itanium -emit-llvm -o - -DPROTOTYPE -DINSTANTIATE | FileCheck --check-prefix=CHECK-PROTOTYPE-INSTANTIATE %s // RUN: %clang_cc1 %s -DREDEFINE -verify // RUN: %clang_cc1 %s -DPROTOTYPE -DREDEFINE -verify // PR8007: friend function not instantiated, reordered version. // Corresponds to http://gcc.gnu.org/bugzilla/show_bug.cgi?id=38392 +// CHECK: define linkonce_odr{{.*}}_ZlsR11std_ostreamRK8StreamerI3FooE +// CHECK-PROTOTYPE: define linkonce_odr{{.*}}_ZlsR11std_ostreamRK8StreamerI3FooE +// CHECK-INSTANTIATE: define linkonce_odr{{.*}}_ZlsR11std_ostreamRK8StreamerI3FooE +// CHECK-PROTOTYPE-INSTANTIATE: define linkonce_odr{{.*}}_ZlsR11std_ostreamRK8StreamerI3FooE + struct std_ostream { int dummy; Index: test/SemaTemplate/inject-templated-friend.cpp =================================================================== --- test/SemaTemplate/inject-templated-friend.cpp +++ test/SemaTemplate/inject-templated-friend.cpp @@ -1,7 +1,9 @@ -// RUN: %clang %s -S -emit-llvm -o - | grep -e "define linkonce_odr.*_ZlsR11std_ostreamRK8StreamerI3FooE" +// RUN: %clang_cc1 %s -emit-llvm -cxx-abi itanium -o - | FileCheck %s // RUN: %clang_cc1 %s -DREDEFINE -verify // PR8007: friend function not instantiated. +// CHECK: define linkonce_odr{{.*}}_ZlsR11std_ostreamRK8StreamerI3FooE + struct std_ostream { int dummy; Index: test/SemaTemplate/instantiate-complete.cpp =================================================================== --- test/SemaTemplate/instantiate-complete.cpp +++ test/SemaTemplate/instantiate-complete.cpp @@ -1,4 +1,5 @@ -// RUN: %clang_cc1 -fsyntax-only -verify %s +// RUN: %clang_cc1 -cxx-abi itanium -fsyntax-only -verify %s +// RUN: %clang_cc1 -cxx-abi microsoft -DMSABI -fsyntax-only -verify %s // Tests various places where requiring a complete type involves // instantiation of that type. @@ -7,6 +8,9 @@ struct X { X(T); +#ifdef MSABI +// expected-error@+2{{data member instantiated with function type 'long (long)'}} +#endif T f; // expected-error{{data member instantiated with function type 'float (int)'}} \ // expected-error{{data member instantiated with function type 'int (int)'}} \ // expected-error{{data member instantiated with function type 'char (char)'}} \ @@ -40,7 +44,11 @@ void test_memptr(X *p1, long X::*pm1, X *p2, +#ifdef MSABI + long (X::*pm2)(long)) { // expected-note{{in instantiation of template class 'X' requested here}} +#else long (X::*pm2)(long)) { +#endif (void)(p1->*pm1); } Index: test/SemaTemplate/instantiate-exception-spec-cxx11.cpp =================================================================== --- test/SemaTemplate/instantiate-exception-spec-cxx11.cpp +++ test/SemaTemplate/instantiate-exception-spec-cxx11.cpp @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 -ftemplate-depth 16 -fcxx-exceptions -fexceptions %s +// RUN: %clang_cc1 -fsyntax-only -verify -cxx-abi itanium -std=c++11 -ftemplate-depth 16 -fcxx-exceptions -fexceptions %s // DR1330: an exception specification for a function template is only // instantiated when it is needed. Index: test/SemaTemplate/virtual-member-functions.cpp =================================================================== --- test/SemaTemplate/virtual-member-functions.cpp +++ test/SemaTemplate/virtual-member-functions.cpp @@ -1,4 +1,5 @@ -// RUN: %clang_cc1 -fsyntax-only -verify %s +// RUN: %clang_cc1 -cxx-abi itanium -fsyntax-only -verify %s +// RUN: %clang_cc1 -cxx-abi microsoft -DMSABI -fsyntax-only -verify %s namespace PR5557 { template struct A { @@ -71,8 +72,13 @@ int f() { return B::value; } +#ifdef MSABI + void test_typeid(B::Inner bfi) { // expected-note{{implicit destructor}} + (void)typeid(bfi); +#else void test_typeid(B::Inner bfi) { (void)typeid(bfi); // expected-note{{implicit destructor}} +#endif } template @@ -80,7 +86,7 @@ void f() { } }; - void test_X(X xi, X xf) { + void test_X(X &xi, X &xf) { xi.f(); } }