brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.0 KiB · caec42b Raw
68 lines · cpp
1// RUN: %clang_cc1 -fsyntax-only -verify -Wundefined-func-template %s2 3namespace GH74016 {4  template <typename T> class B {5  public:6    constexpr void foo(const T &) { bar(1); }7    virtual constexpr void bar(unsigned int) = 0;8  };9 10  template <typename T> class D : public B<T> {11  public:12    constexpr void bar(unsigned int) override {}13  };14 15  void test() {16    auto t = D<int>();17    t.foo(0);18  }19};20 21namespace call_pure_virtual_function_from_virtual {22  template <typename T> class B {23  public:24    const void foo(const T &) { B::bar(1); } // expected-warning {{instantiation of function 'call_pure_virtual_function_from_virtual::B<int>::bar' required here, but no definition is available}}25    // expected-note@-1 {{add an explicit instantiation declaration to suppress this warning if 'call_pure_virtual_function_from_virtual::B<int>::bar' is explicitly instantiated in another translation unit}}26    virtual const void bar(unsigned int) = 0; // expected-note {{forward declaration of template entity is here}}27  };28 29  template <typename T> class D : public B<T> {30  public:31    const void bar(unsigned int) override {}32  };33 34  void test() {35    auto t = D<int>();36    t.foo(0); // expected-note {{in instantiation of member function 'call_pure_virtual_function_from_virtual::B<int>::foo' requested here}}37  }38};39 40namespace non_pure_virtual_function {41  template <typename T> class B {42  public:43    constexpr void foo(const T &) { bar(1); }44 45    virtual constexpr void bar(unsigned int); // expected-warning {{inline function 'non_pure_virtual_function::B<int>::bar' is not defined}}46    // expected-note@-1 {{forward declaration of template entity is here}}47    // expected-note@-2 {{forward declaration of template entity is here}}48    // expected-note@-3 {{forward declaration of template entity is here}}49  };50 51  template <typename T> class D : public B<T> { // expected-warning {{instantiation of function 'non_pure_virtual_function::B<int>::bar' required here, but no definition is available}}52// expected-warning@-1 {{instantiation of function 'non_pure_virtual_function::B<int>::bar' required here, but no definition is available}}53// expected-warning@-2 {{instantiation of function 'non_pure_virtual_function::B<int>::bar' required here, but no definition is available}}54// expected-note@-3 {{add an explicit instantiation declaration to suppress this warning if 'non_pure_virtual_function::B<int>::bar' is explicitly instantiated in another translation unit}}55// expected-note@-4 {{add an explicit instantiation declaration to suppress this warning if 'non_pure_virtual_function::B<int>::bar' is explicitly instantiated in another translation unit}}56// expected-note@-5 {{add an explicit instantiation declaration to suppress this warning if 'non_pure_virtual_function::B<int>::bar' is explicitly instantiated in another translation unit}}57// expected-note@-6 {{used here}}58 59  public:60    constexpr void bar(unsigned int) override { }61  };62 63  void test() {64    auto t = D<int>();65    t.foo(0);66  }67};68