cor3ntin added a comment.

In D155175#4498788 <https://reviews.llvm.org/D155175#4498788>, @efriedma wrote:

> Do we need CodeGen testcases here for full coverage?  The testcases from the 
> issue passed with -fsyntax-only.
>
> --------
>
> With this patch, the following cases produce errors that don't really make 
> sense to me:
>
>   consteval int f(int x) {
>       return x;
>   }
>   struct SS {
>       int y;
>       int x = f(this->y);
>       constexpr SS(int yy) : y(yy) {}
>   };
>   SS s = {1};
>
>
>
>   <stdin>:6:13: error: call to consteval function 'f' is not a constant 
> expression
>       6 |     int x = f(this->y);
>         |             ^
>   <stdin>:7:15: note: in the default initializer of 'x'
>       7 |     constexpr SS(int yy) : y(yy) {}
>         |               ^
>   <stdin>:6:5: note: declared here
>       6 |     int x = f(this->y);
>         |     ^
>   <stdin>:6:15: note: use of 'this' pointer is only allowed within the 
> evaluation of a call to a 'constexpr' member function
>       6 |     int x = f(this->y);
>         |               ^
>   1 error generated.

This seems reasonable,  it's equivalent to  `constexpr SS(int yy) : y(yy), 
x(f(y)) {}` = which is not a valid call of a consteval function. And the 
constructor is neither defaulted, nor templated, so escalation does not happen. 
I agree that "use of 'this' pointer is only allowed within the evaluation of a 
call to a 'constexpr' member function" isn't amazing but it's preexisting
https://godbolt.org/z/sa78bzsed

>   consteval int f(int x) {
>       return x;
>   }
>   struct SS {
>       int y;
>       int x = f(this->y);
>       consteval SS(int yy) : y(yy) {}
>   };
>   SS s = {1};
>
>   <stdin>:6:13: error: cannot take address of consteval function 'f' outside 
> of an immediate invocation
>       6 |     int x = f(this->y);
>         |             ^
>   <stdin>:1:15: note: declared here
>       1 | consteval int f(int x) {
>         |               ^
>   1 error generated.

Yup, this is not great - I think it's unrelated the degradation of error 
message was introduced between 15 and 16, I probably want to investigate in a 
separate patch, not sure yet.

> Somehow the following is accepted, though:
>
>   consteval int f(int x) {
>       return x;
>   }
>   struct SS {
>       int y;
>       int x = f(this->y);
>       template<typename T> constexpr SS(T yy) : y(yy) {}
>   };
>   SS s = {1};

Yes, this is bad.  Thanks for finding it.
It compiles because 1 is a constant and somehow it ends up evaluating f(1) 
instead of f(y) - replacing 1 by a reference to a local variable produce the 
expected behavior. Investigating.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D155175/new/

https://reviews.llvm.org/D155175

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to