This is a kind reminder to review the patch.

================
Comment at: lib/Parse/ParseExpr.cpp:1459-1464
@@ +1458,8 @@
+          if (LHS.isUsable()) {
+            Expr *Fn = LHS.get()->IgnoreParens();
+            if (DeclRefExpr *DRE = dyn_cast_or_null<DeclRefExpr>(Fn)) {
+              FunctionDecl *FnDecl =
+                  dyn_cast_or_null<FunctionDecl>(DRE->getDecl());
+              BuiltinId = (FnDecl ? FnDecl->getBuiltinID() : 0);
+            }
+          }
----------------
rsmith wrote:
> Code in Parse shouldn't be inspecting the AST like this. If you really need 
> different parse rules for the argument of __noop, maybe make it a keyword 
> rather than a builtin?
Firstly I tried to make __noop as a separate keyword however __noop has a 
builtin behavior in 95% cases. For example __noop will be a normal variable 
after "int __noop;" declaration. I suppose that it will be inefficient to 
detect all these cases for a new key-word.

================
Comment at: lib/Parse/ParseExpr.cpp:1466-1467
@@ -1457,1 +1465,4 @@
+          }
+          Sema::InsideNoopRAII SubstIndex(Actions,
+                                          BuiltinId == Builtin::BI__noop);
           if (ParseExpressionList(ArgExprs, CommaLocs, [&] {
----------------
rsmith wrote:
> Can you enter an unevaluated context here rather than inventing a new sort of 
> context for this case? Global state in Sema doesn't seem like the right way 
> to handle this -- if you trigger an instantiation from within this context, 
> you should not instantiate the template in noop mode (it might end up being 
> used outside noop mode too).
Entering unevaluated context doesn’t prevent from template instantiation here. 
Global state points that we are inside __noop parsing now.

================
Comment at: lib/Sema/SemaExpr.cpp:13055
@@ +13054,3 @@
+  // This behaviour is the same as Microsoft compiler behaviour.
+  if (!InsideNoop || !isa<FunctionDecl>(E->getDecl()))
+    MarkExprReferenced(*this, E->getLocation(), E->getDecl(), E, OdrUse);
----------------
rnk wrote:
> rnk wrote:
> > Why do we need to mark non-FunctionDecls referenced? Surely they can 
> > trigger template instantiation of other function decls.
> Can this just be `if (InsideNoop) return;` at the beginning of the function?
Non-FunctionDecls are marked as referenced because this prevents warnings about 
unused variables

================
Comment at: test/Sema/builtin-ms-noop-errors.cpp:16
@@ +15,3 @@
+  int var1, var2, var3, var4, var5, var6, var7, var8;
+  ((__noop))(function2<void>()); // expected-note{{'__noop' is a builtin with 
type 'int ()'}}
+  __noop(Z(), Z(), (function2<int>()), Z1(function2<int>()));
----------------
chatur01 wrote:
> I find checking this note weird. I know `__noop` is defined as taking `...` 
> from the Builtins.def file, but `ASTContext::GetBuiltinType` decides to 
> ignore it and generate the empty argument list instead. 
This patch doesn’t influence on this. I simply added this case (error + note) 
in a test. Deleted them.

http://reviews.llvm.org/D9000

EMAIL PREFERENCES
  http://reviews.llvm.org/settings/panel/emailpreferences/



_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to