Home | History | Annotate | Download | only in CodeGenCXX
      1 // RUN: %clang_cc1 -triple %itanium_abi_triple -emit-llvm-only %s -verify -DTEST1
      2 // RUN: %clang_cc1 -triple %itanium_abi_triple -emit-llvm-only %s -verify -DTEST2 -emit-llvm -o - | FileCheck %s
      3 // RUN: %clang_cc1 -triple %itanium_abi_triple -emit-llvm-only %s -verify -DTEST3
      4 // RUN: %clang_cc1 -triple %itanium_abi_triple -emit-llvm-only %s -verify -DTEST4
      5 
      6 #ifdef TEST1
      7 
      8 // rdar://15522601
      9 class MyClass {
     10  static void meth();
     11 };
     12 void MyClass::meth() { } // expected-note {{previous}}
     13 extern "C" {
     14   void _ZN7MyClass4methEv() { } // expected-error {{definition with same mangled name as another definition}}
     15 }
     16 
     17 #elif TEST2
     18 
     19 // expected-no-diagnostics
     20 
     21 // We expect no warnings here, as there is only declaration of _ZN1TD1Ev
     22 // function, no definitions.
     23 extern "C" void _ZN1TD1Ev();
     24 struct T {
     25   ~T() {}
     26 };
     27 
     28 // We expect no warnings here, as there is only declaration of _ZN2nm3abcE
     29 // global, no definitions.
     30 extern "C" {
     31   int _ZN2nm3abcE;
     32 }
     33 
     34 namespace nm {
     35   float abc = 2;
     36 }
     37 // CHECK: @_ZN2nm3abcE = global float
     38 
     39 float foo() {
     40   _ZN1TD1Ev();
     41 // CHECK: call void bitcast ({{.*}} (%struct.T*)* @_ZN1TD1Ev to void ()*)()
     42   T t;
     43 // CHECK: call {{.*}} @_ZN1TD1Ev(%struct.T* %t)
     44   return _ZN2nm3abcE + nm::abc;
     45 }
     46 
     47 #elif TEST3
     48 
     49 extern "C" void _ZN2T2D2Ev() {}; // expected-note {{previous definition is here}}
     50 
     51 struct T2 {
     52   ~T2() {} // expected-error {{definition with same mangled name as another definition}}
     53 };
     54 
     55 void foo() {
     56   _ZN2T2D2Ev();
     57   T2 t;
     58 }
     59 
     60 #elif TEST4
     61 
     62 extern "C" {
     63   int _ZN2nm3abcE = 1; // expected-note {{previous definition is here}}
     64 }
     65 
     66 namespace nm {
     67   float abc = 2; // expected-error {{definition with same mangled name as another definition}}
     68 }
     69 
     70 float foo() {
     71   return _ZN2nm3abcE + nm::abc;
     72 }
     73 
     74 #else
     75 
     76 #error Unknwon test
     77 
     78 #endif
     79 
     80