jyknight added a comment.

In D120159#3341224 <https://reviews.llvm.org/D120159#3341224>, @aaron.ballman 
wrote:

> Btw, I think there may be some functionality missing for AST dumping, so I'd 
> like to see some additional tests for that.

I'm not sure what test would actually show a problem (or lack thereof) in the 
ast dumping -- AFAICT, UnnamedGlobalConstantDecl can't actually show up in an 
AST dump at the moment. The AST generated for a `__builtin_source_location` 
call doesn't contain one, since it's only when evaluating the value that you 
receive an LValue pointing to an UnnamedGlobalConstantDecl. But 
https://github.com/llvm/llvm-project/blob/fdfe26ddbeb1a5eb6106a6a27d6f8240deca543f/clang/lib/AST/TextNodeDumper.cpp#L535
 doesn't print those usefully, anyhow.



================
Comment at: clang/docs/LanguageExtensions.rst:3343-3344
+defined, and must contain exactly four fields: ``const char *_M_file_name``,
+``const char *_M_function_name``, ``<any-integral-type> _M_line``, and
+``<any-integral-type> _M_column``. The fields will be populated in the same
+manner as the above four builtins, except that ``_M_function_name`` is 
populated
----------------
aaron.ballman wrote:
> Doesn't the type for `<any-integral-type>` matter though, due to layout 
> differences based on the size of the integer type picked?
> 
> Also, a downside of requiring this type to be defined before the builtin can 
> be used is that this builtin would otherwise be suitable in C, but there's no 
> way to name that particular type. Is there anything we can do to keep this 
> builtin generic enough to be used in C as well?
The type of the integer (as well as ordering of the fields) doesn't matter, 
because the code populates fields in the actual struct layout as defined, it 
doesn't assume a particular layout.

As for making it usable from C code, possibly we could have it attempt to 
look-up a `__source_location_impl` type in C mode (or maybe always, as a 
fallback if std::source_location::__impl doesn't exist). 

But, that's something we could add later if needed -- and before going that 
route, I think we should discuss with GCC/libstdc++ to try to remain compatible.


================
Comment at: clang/include/clang/AST/DeclCXX.h:4192
+/// An artificial decl, representing am global anonymous constant value which 
is
+/// uniquified by value within a compilation.
+///
----------------
aaron.ballman wrote:
> I presume this is what was meant, right?
Yep.


================
Comment at: clang/include/clang/AST/DeclCXX.h:4221
+  /// Print this in a human-readable format.
+  void printName(llvm::raw_ostream &OS) const override;
+
----------------
aaron.ballman wrote:
> `printName()` in a class named `UnnamedGlobalConstantDecl` (which isn't a 
> `NamedDecl`) seems a bit confusing as to what this actually prints.
> 
> Also, what is this overriding? `NamedDecl` has a virtual `printName()` 
> function, but `ValueDecl` does not. I have the sneaking suspicion that this 
> can be removed.
`class ValueDecl : public NamedDecl` -- so, UnnamedGlobalConstantDecl _is_ a 
"NamedDecl". I suspect it's not strictly needed, but it does affect what's 
printed in debug output for this type.


================
Comment at: clang/include/clang/AST/Expr.h:4709
 
-  bool isStringType() const {
+  bool isIntType() const {
     switch (getIdentKind()) {
----------------
aaron.ballman wrote:
> Should this also be marked `LLVM_READONLY` as in the original interface?
I don't think it'd actually make a difference, and we don't typically go around 
annotating everything with that attribute. It was weird that isStringType 
wasn't annotated but isIntType was, in the first place.


================
Comment at: clang/include/clang/Serialization/ASTBitCodes.h:44
 /// AST files at this time.
 const unsigned VERSION_MAJOR = 15;
 
----------------
aaron.ballman wrote:
> Do we need to bump this value now that we have a new kind of AST node?
Probably so. It looks like we don't generally bump this number, but that's 
probably accidental.


================
Comment at: clang/lib/AST/Expr.cpp:2270
+        // __builtin_FUNCTION() above returns!
+        const Decl *CurDecl = dyn_cast_or_null<Decl>(Context);
+        Value.getStructField(F->getFieldIndex()) = MakeStringLiteral(
----------------
aaron.ballman wrote:
> Under what conditions can `Context` be null? (should this be a `dyn_cast` 
> instead?)
That came from the similar code above for __builtin_FUNCTION. I don't think it 
can actually be null (in either place). Changed in both.


================
Comment at: clang/lib/AST/ExprConstant.cpp:8830-8832
+      // (GCC apparently doesn't diagnose casts from void* to T* in constant
+      // evaluation, regardless of the types of the object or pointer; a
+      // subsequent access through the wrong type is diagnosed, however).
----------------
aaron.ballman wrote:
> Do we want to be even more restrictive here and tie it to libstdc++ (e.g., 
> like we did in 
> https://github.com/llvm/llvm-project/blob/main/clang/lib/Sema/SemaDeclCXX.cpp#L12352)
I don't see anything in the code you linked that makes it libstdc++-tied? But, 
in any case, I think restricting to std::source_location::current is 
sufficiently narrow that it doesn't much matter.

We also have the option of not doing this hack, since it's going to be fixed in 
libstdc++. However, given that a similar hack is already present for 
std::allocator, extending it to source_location doesn't seem that terrible. 

(And IMO, it would make sense for the C++ standard to actually permit this in 
constant evaluation, anyways...)


================
Comment at: clang/lib/Sema/SemaExpr.cpp:3405
+  case Decl::UnnamedGlobalConstant:
+    valueKind = VK_LValue;
+    break;
----------------
aaron.ballman wrote:
> Perhaps stupid question, but do we want this to be an lvalue as opposed to a 
> prvalue?
I think so? I was thinking of it as acting effectively like a string literal.


================
Comment at: clang/test/SemaCXX/source_location.cpp:383-385
+  //  static_assert(is_equal(Default.info.function(), 
"TestCtor<>::TestCtor()"));
+  static_assert(is_equal(Default.ctor_info.function(), ""));
+  //  static_assert(is_equal(Template.info.function(), 
"TestCtor<>::TestCtor(int, U) [U = std::source_location]"));
----------------
aaron.ballman wrote:
> Why are these commented out?
Oops -- intended to update those to the proper strings. Fixed.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D120159

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

Reply via email to