gchatelet added inline comments.

================
Comment at: clang/include/clang/Basic/DiagnosticSemaKinds.td:3600
   "attribute">;
+def err_attribute_no_builtin_invalid_builtin_name : Error<
+  "'%0' is not a valid builtin name for %1">;
----------------
aaron.ballman wrote:
> I think this should be a warning rather than an error.
> 
> Imagine the situation where the user uses Clang 11 to write their code and 
> they disable a Clang 11-specific builtin from being used, but then they try 
> to compile the code in Clang 10 which doesn't know about the builtin.
> 
> Rather than err, it seems reasonable to warn about the unknown builtin name 
> (under a new warning flag group under `-Wattributes`) and then just ignore 
> the attribute. Because the builtin is unknown anyway, we won't transform any 
> constructs to use it.
Makes perfect sense, thx for pointing this out.


================
Comment at: clang/lib/Sema/SemaDecl.cpp:9508-9510
+  // FIXME: We should really be doing this in SemaDeclAttr.cpp::handleNoBuiltin
+  // but there is a bug with FunctionDecl::isThisDeclarationADefinition() which
+  // always returns false before Sema::ActOnStartOfFunctionDef is called.
----------------
rsmith wrote:
> aaron.ballman wrote:
> > rsmith wrote:
> > > aaron.ballman wrote:
> > > > handleNoBuiltin -> handleNoBuiltinAttr
> > > I am not convinced that this is a bug -- the function declaration does 
> > > not become a definition until the parser reaches the definition.
> > > 
> > > In any case, I don't think the predicate you want is "is this declaration 
> > > a definition?". Rather, I think what you want is, "does this declaration 
> > > introduce an explicit function body?". In particular, we should not 
> > > permit uses of this attribute on defaulted or deleted functions, nor on 
> > > functions that have a definition by virtue of using 
> > > `__attribute__((alias))`. So it probably should be a syntactic check on 
> > > the form of the declarator (that is, the check you're perrforming here), 
> > > and the check should probably be `D.getFunctionDefinitionKind() == 
> > > FDK_Definition`. (A custom diagnostic for using the attribute on a 
> > > defaulted or deleted function would be nice too, since the existing 
> > > diagnostic text isn't really accurate in those cases.)
> > > In particular, we should not permit uses of this attribute on defaulted 
> > > or deleted functions
> > 
> > Deleted functions, sure. Defaulted functions... not so sure. I could sort 
> > of imagine wanting to instruct a defaulted assignment operator that does 
> > memberwise copy that it's not allowed to use a builtin memcpy, for 
> > instance. Or is this a bad idea for some reason I'm not thinking of?
> `-fno-builtin` does not turn off using `llvm.memcpy` for copying memory, and 
> it doesn't turn off `llvm.memcpy` being lowered to a call to `memcpy`. 
> Allowing this for defaulted functions would only give a false sense of 
> security, at least for now (though I could imagine we might find some way to 
> change that in the future).
> 
> Also, trivial defaulted functions (where we're most likely to end up with 
> `memcpy` calls) are often not emitted at all, instead being directly inlined 
> by the frontend, so there's nowhere to attach a `no-builtin-memcpy` LLVM 
> attribute (we'd need to put the attribute on all callers of those functions) 
> even if LLVM learned to not emit calls to `memcpy` to implement `llvm.memcpy` 
> when operating under a `no-builtin-memcpy` constraint.
> I am not convinced that this is a bug -- the function declaration does not 
> become a definition until the parser reaches the definition.

@rsmith It may not be a bug but it is currently used in a buggy manner (See 
D68379).
An assert to prevent misuse would be welcome IMHO, I've added a note on the 
function meanwhile.


================
Comment at: clang/test/Sema/no-builtin.c:26
+int __attribute__((no_builtin("*"))) variable;
+// expected-warning@-1 {{'no_builtin' attribute only applies to functions}}
----------------
aaron.ballman wrote:
> You should probably add another test case for this situation:
> ```
> void whatever() __attribute__((no_builtin("*", "*"))) {}
> ```
> and for member functions in C++ as well:
> ```
> struct S {
>   void whatever() __attribute__((no_builtin("memcpy"))) {}
>   virtual void intentional() __attribute__((no_builtin("memcpy"))) {}
> };
> ```
```
void whatever() __attribute__((no_builtin("*", "*"))) {}
```

I've added a few ones.

```
struct S {
  void whatever() __attribute__((no_builtin("memcpy"))) {}
  virtual void intentional() __attribute__((no_builtin("memcpy"))) {}
};
```

What do you want me to test for this one?


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D68028



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

Reply via email to