================
@@ -171,6 +171,11 @@ Attribute Changes in Clang
   automatic diagnostic to use parameters of types that the format style
   supports but that are never the result of default argument promotion, such as
   ``float``. (`#59824: <https://github.com/llvm/llvm-project/issues/59824>`_)
+- The ``constructor`` and ``destructor`` attributes now diagnose when:
+  - the priority is not between 101 and 65535, inclusive,
+  - the function it is applied to accepts arguments or has a non-void return
----------------
AaronBallman wrote:

> I'm more considering a case where someone wants to use an otherwise 'normal' 
> function as their constructor/destructor, where the return value is perhaps 
> useful if the program is continuing (but then obviously not when it is not). 
> I would think that the RETURN should at minimum be only a warning (or perhaps 
> warning-as-error?), since this is otherwise a breaking change.

That was the case that concerned me as well, but I've not seen any evidence of 
such code existing in the wild.

> The params list being nothing makes sense, because there is no valid code 
> generation that did that before AFAIK, but an ignorable return type is 
> meaningful. In your func case, I don't see a problem with that, presume the 
> 1st line was something like:
> ```
> if (!GlobalAllocator) InitAllocator(GlobalAllocator);
> ```
> and they were using the constructor call to initialize that (and not caring 
> about the object it was returning). This would cause this error to be 
> breaking.

Look at the codegen for my example and that should make it more clear why it's 
an issue: https://godbolt.org/z/qncWqqovb

The problem is that there's no way to return from that function without 
inducing UB. You either return a value (and the hidden pointer is invalid so 
you just did an out of bounds write somewhere) or you don't return any value 
(no out of bounds write to the hidden pointer, but oops, UB to fall off the end 
of the function that way).

You can devise circumstances where it's safe, but unless there's evidence that 
people use the attribute this way, I don't see a compelling reason to give 
people a gun to point at their feet.

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

Reply via email to