nickdesaulniers added inline comments.

================
Comment at: clang/lib/AST/Expr.cpp:3164
+      const QualType &QT = cast<DeclRefExpr>(this)->getDecl()->getType();
+      if (QT->isStructureType() && QT.isConstQualified())
+        return true;
----------------
efriedma wrote:
> efriedma wrote:
> > nickdesaulniers wrote:
> > > efriedma wrote:
> > > > nickdesaulniers wrote:
> > > > > nickdesaulniers wrote:
> > > > > > Interesting, playing with this more in godbolt, it looks like the 
> > > > > > struct doesn't even have to be const qualified.
> > > > > Or, rather, behaves differently between C and C++ mode;
> > > > > 
> > > > > C -> const required
> > > > > C++ -> const not required
> > > > In C++, global variable initializers don't have to be constant 
> > > > expressions at all.
> > > > 
> > > > Do we really need to check GNUMode here? We try to avoid it except for 
> > > > cases where we would otherwise reject valid code.
> > > > 
> > > > Do we need to worry about arrays here?
> > > > In C++, global variable initializers don't have to be constant 
> > > > expressions at all.
> > > 
> > > It looks like my test cases are supported already in Clang today, in C++ 
> > > mode only and not C.  Maybe there's some alternative code path that I 
> > > should be looking to reuse?
> > > 
> > > > Do we really need to check GNUMode here?
> > > 
> > > Maybe a `-Wpedantic` diag would be more appropriate otherwise? (GCC does 
> > > not warn for these cases with `-Wpedantic`.  If the answer to your 
> > > question is `no`, then that means supporting these regardless of language 
> > > mode.  (I'm ok with that, was just being maybe overly cautious with 
> > > `GNUMode`, but maybe folks with better knowledge of the language 
> > > standards have better thoughts?)
> > > 
> > > > Do we need to worry about arrays here?
> > > 
> > > I don't think arrays are supported: https://godbolt.org/z/RiZPpM
> > Also, do we need to check that we actually have a definition for the 
> > variable?
> The C++ standard is substantially different from C.  C++ global initializers 
> can be evaluated at runtime.  So we don't call this code at all in C++.
> 
> Independent of that, we do have pretty complete support for constant 
> evaluation of structs in C++ to support constexpr, and we should be able to 
> leverage that.
> 
> ----
> 
> For arrays, I was thinking of something like this:
> 
> ```
> const int foo[3] = { 0, 1, 2 };
> int bar = foo[0];
> ```
> 
> ----
> 
> We generally don't generate pedantic warnings unless the user uses an 
> extension that's disallowed by the C standard.  (The idea is that clang with 
> -pedantic should generate a diagnostic every place the C standard requires a 
> diagnostic.  It's not a catch-all for extensions.)
> 
> We could separately generate some sort of portability warning, but not sure 
> anyone would care to enable it.
> Do we really need to check GNUMode here?

Will remove.

> Do we need to worry about arrays here?

Yep; as long as the base and index are `const` qualified, GCC allows them.  
Will add tests.

> Also, do we need to check that we actually have a definition for the variable?

Yep, will add tests.

> It's not a catch-all for extensions.

Ah, got it.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D76096



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

Reply via email to