hazohelet added inline comments.

================
Comment at: clang/lib/AST/ExprConstant.cpp:2422
+              << BS.getType();
+          Info.Note(BS.getBeginLoc(), 
diag::note_constexpr_base_inherited_here);
+          return false;
----------------
hazohelet wrote:
> tbaeder wrote:
> > Can you pass `<< BS.getSourceRange()` here? Does that improve things?
> Currently, `DiagLoc` points to the variable declaration and the 
> `BS.getSourceRange` covers the line where the base class is inherited. This 
> causes distant source range and thus unnecessarily many lines of snippet 
> printing.
> e.g.
> ```
> struct Base {
>   Base() = delete;
> };
> struct Derived : Base {
>   constexpr Derived() {}
> };
> constexpr Derived dd;
> ```
> Output:
> ```
> source.cpp:7:19: error: constexpr variable 'dd' must be initialized by a 
> constant expression
>     7 | constexpr Derived dd;
>       |                   ^~
> source.cpp:7:19: note: constructor of base class 'Base' is not called
>     7 | struct Derived : Base {
>       |                  ~~~~
>     8 |   constexpr Derived() {}
>     9 | };
>    10 | constexpr Derived dd;
>       |                   ^
> source.cpp:4:18: note: base class inherited here
>     4 | struct Derived : Base {
>       |                  ^
> ```
> (The line numbers seem incorrect but is already reported in 
> https://github.com/llvm/llvm-project/issues/63524)
> 
> I think we don't need two notes here because the error is already pointing to 
> the variable declaration. Having something like the following would be 
> succint.
> ```
> source.cpp:7:19: error: constexpr variable 'dd' must be initialized by a 
> constant expression
>     7 | constexpr Derived dd;
>       |                   ^~
> source.cpp:4:18: note: constructor of base class 'Base' is not called
>     4 | struct Derived : Base {
>       |                  ^~~~
> ```
> Providing source range would be beneficial because the inherited class often 
> spans in a few lines (the code in the crashing report, for example)
Sorry, I was looking at the line above. The distant source range problem 
doesn't occur.

I tested another input
```
struct Base {
  Base() = delete;
  constexpr Base(int){}
};

struct Derived : Base {
  constexpr Derived() {}
  constexpr Derived(int n): Base(n) {}
};

constexpr Derived darr[3] = {1, Derived(), 3};
```
expecting that the `DiagLoc` points to the second initializer `Derived()`, but 
it pointed to the same location as the error, so I'm still in favor of the idea 
of having a single note here.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D153969

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

Reply via email to