rsmith added inline comments.

================
Comment at: include/clang/AST/ASTContext.h:279
 
+  /// A cache mapping a function declaration to its human-readable function or
+  /// file name.
----------------
Comment seems out of date: the key here is a string rather than a function 
declaration.


================
Comment at: lib/AST/Expr.cpp:2012-2020
+  case SourceLocExpr::Function:
+  case SourceLocExpr::File: {
+    return [&]() {
+      auto MkStr = [&](StringRef Tmp) {
+        StringLiteral *Res = Ctx.getPredefinedStringLiteralFromCache(Tmp);
+        return APValue(Res, CharUnits::Zero(), APValue::NoLValuePath(), 0);
+      };
----------------
Combining these two cases doesn't really make sense since they have nothing in 
common (except that both produce strings). Instead, consider hoisting the 
`MkStr` lambda out of the switch and separating the cases.


================
Comment at: lib/AST/Expr.cpp:2022-2023
+      const auto *FD = dyn_cast_or_null<FunctionDecl>(Context);
+      if (!FD)
+        return MkStr("");
+      // If we have a simple identifier there is no need to cache the
----------------
Why not call into `PredefinedExpr` for the other cases that `__FUNCTION__` 
supports (`BlockDecl`, `CapturedDecl`, `ObjCMethodDecl`)?


================
Comment at: lib/AST/Expr.cpp:2026-2027
+      // human readable name.
+      if (IdentifierInfo *II = FD->getDeclName().getAsIdentifierInfo())
+        return MkStr(II->getNameStart());
+      return MkStr(PredefinedExpr::ComputeName(PredefinedExpr::Function, FD));
----------------
Is the benefit of avoiding a `std::string` allocation here really worth the 
cost of duplicating this portion of the `__FUNCTION__` logic?

If we care about the extra string allocation, it'd seem more worthwhile to 
extend `ComputeName` so that a stack-allocated `SmallString<N>` buffer can be 
passed in (eg, `StringRef ComputeName(..., SmallVectorImpl<char> 
&NameStorage)`, where `NameStorage` may, but need not, be used to store the 
resulting string).


================
Comment at: lib/AST/ExprConstant.cpp:2653-2655
+                                            APValue::LValueBase const &Base,
                                             uint64_t Index) {
+  const Expr *Lit = Base.get<const Expr *>();
----------------
Hm, why the move of the `get` from caller to callee? This widens the set of 
possible arguments to `extractStringLiteralCharacter`, but all the new 
possibilities result in crashes -- shouldn't the caller, rather than the 
callee, still be the place where we house the assertion that the base is indeed 
an expression?


================
Comment at: lib/AST/ExprConstant.cpp:3370-3371
+
+  assert((!Base || !isa<SourceLocExpr>(Base)) &&
+         "Base should have already been transformed into a StringLiteral");
+
----------------
There are lots of forms of expression that cannot be the base of an `LValue` 
(see the list above `LValueExprEvaluator` for the expression forms that *can* 
be the base of an `LValue`); is it important to give this one special treatment?


================
Comment at: lib/CodeGen/CGExprConstant.cpp:1762
+ConstantLValue
+ConstantLValueEmitter::VisitSourceLocExpr(const SourceLocExpr *E) {
+  const APValue::LValueBase& Base = Value.getLValueBase();
----------------
Hmm, is this reachable? I thought `SourceLocExpr` was always a prvalue.


================
Comment at: lib/CodeGen/CGExprConstant.cpp:1766
+      "Expected string literal result");
+  const StringLiteral* Str = cast<StringLiteral>(Base.get<const Expr*>());
+
----------------
`const auto *Str`


================
Comment at: lib/CodeGen/CGExprConstant.cpp:1768-1769
+
+  // assert(Base.isGlobalString() &&
+  //       "source location expression does not evaluate to global string?");
+  return CGM.GetAddrOfConstantCString(Str->getBytes());
----------------
Please remove or uncomment this.


================
Comment at: lib/Sema/TreeTransform.h:9990
+  bool NeedRebuildFunc = E->getIdentType() == SourceLocExpr::Function &&
+                         isa<FunctionDecl>(getSema().CurContext) &&
+                         getSema().CurContext != E->getParentContext();
----------------
If we generalize `__builtin_FUNCTION()` to behave like `__FUNCTION__` (and 
handle function-like contexts that aren't `FunctionDecl`s), this `isa` check 
will be wrong.


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

https://reviews.llvm.org/D37035



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

Reply via email to