[PATCH] D153969: [clang][ExprConstant] Fix crash on uninitialized base class subobject

Takuya Shimizu via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Thu Jun 29 09:12:49 PDT 2023


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



More information about the cfe-commits mailing list