================
@@ -0,0 +1,232 @@
+// RUN: %check_clang_tidy %s bugprone-unsafe-crtp %t
+
+namespace class_implicit_ctor {
+template <typename T>
+class CRTP {};
+// CHECK-MESSAGES: :[[@LINE-1]]:7: warning: the implicit default constructor 
of the CRTP is publicly accessible [bugprone-unsafe-crtp]
+// CHECK-MESSAGES: :[[@LINE-2]]:7: note: consider making it private
+// CHECK-FIXES: CRTP() = default;
+
+class A : CRTP<A> {};
+} // namespace class_implicit_ctor
+
+namespace class_uncostructible {
+template <typename T>
+class CRTP {
+// CHECK-MESSAGES: :[[@LINE-1]]:7: warning: the CRTP cannot be constructed 
from the derived class [bugprone-unsafe-crtp]
+// CHECK-MESSAGES: :[[@LINE-2]]:7: note: consider declaring the derived class 
as friend
+// CHECK-FIXES: friend T;
----------------
whisperity wrote:

> If the only constructor is for a static factory function, which is 
> unaccessible by the derived class, then the derived class cannot be 
> constructed either, right?

@isuckatcs I think you are right, at least I tried to give this some thought 
(actually by trying to construct a counter-example).

```cpp
template <class T>
class Base
{
    Base(int I) {}

protected:
    static Base factory(int I) { return Base{I}; }
};

class Derived : public Base<Derived>
{
    // Derived() : Base(0) {} // Does not work.
    Derived() : Base(Base::factory(1)) {}
};

void test()
{
    Derived D;
}
```

```
<source>:18:13: error: calling a private constructor of class 'Derived'
   18 |     Derived D;
      |             ^
<source>:13:5: note: implicitly declared private here
   13 |     Derived() : Base(Base::factory(1)) {}
      |     ^
```

https://github.com/llvm/llvm-project/pull/82403
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to