erichkeane accepted this revision.
erichkeane added a comment.
This revision is now accepted and ready to land.

Please add the test cases requested, plus a Release Note.  Otherwise LGTM.



================
Comment at: clang/test/Sema/attr-alwaysinline.cpp:36
+        return x;
+}
+
----------------
craig.topper wrote:
> erichkeane wrote:
> > craig.topper wrote:
> > > erichkeane wrote:
> > > > craig.topper wrote:
> > > > > erichkeane wrote:
> > > > > > erichkeane wrote:
> > > > > > > craig.topper wrote:
> > > > > > > > erichkeane wrote:
> > > > > > > > > craig.topper wrote:
> > > > > > > > > > erichkeane wrote:
> > > > > > > > > > > Can you add a test that shows that we warn on 
> > > > > > > > > > > instantiation?  This shouldn't be a dependent declrefexpr 
> > > > > > > > > > > when instantiated.
> > > > > > > > > > > 
> > > > > > > > > > > Additionally, this would make sure that we're properly 
> > > > > > > > > > > propoagating `always_inline`.
> > > > > > > > > > Should this warn
> > > > > > > > > > 
> > > > > > > > > > ```
> > > > > > > > > > template<int D> [[gnu::noinline]]                           
> > > > > > > > > >                      
> > > > > > > > > > int bar(int x) {                                            
> > > > > > > > > >                      
> > > > > > > > > >     if constexpr (D > 1)                                    
> > > > > > > > > >                      
> > > > > > > > > >         [[clang::always_inline]] return bar<D-1>(x + 1);    
> > > > > > > > > >                      
> > > > > > > > > >     else                                                    
> > > > > > > > > >                      
> > > > > > > > > >         return x;                                           
> > > > > > > > > >                      
> > > > > > > > > > }                                                           
> > > > > > > > > >                      
> > > > > > > > > >                                                             
> > > > > > > > > >                      
> > > > > > > > > > int baz(int x) {                                            
> > > > > > > > > >                      
> > > > > > > > > >   return bar<5>(x);                                         
> > > > > > > > > >                      
> > > > > > > > > > }  
> > > > > > > > > > ```
> > > > > > > > > Yes, I would expect that to warn.
> > > > > > > > It looks like handleAlwaysInlineAttr only gets called once so 
> > > > > > > > it doesn't get called after instantiation.
> > > > > > > Hmm... thats unfortunate.  That means we're perhaps not 
> > > > > > > instantiating it correctly.  I'll take some time to poke around 
> > > > > > > as I get a chacne.
> > > > > > Ok, it looks like SemaStmt.cpp's `BuildAttributedStmt` needs to 
> > > > > > handle the attributes.  We should some day do that automatically 
> > > > > > for a majority o f attributes, but for now, just adding the call 
> > > > > > there is sufficient.
> > > > > What I do need to add?
> > > > You should be able to follow what is already there, but I suspect you 
> > > > just need to call some sort of 'handle' function for those to do this.  
> > > > There is one there already youc an crib off of.
> > > Can I do that as a separate patch? Fixing the crash seems like a net 
> > > improvement.
> > I'd prefer they be done together: They are a situation where you cannot 
> > properly test either patch without the other one being fixed, so I believe 
> > they are intrinsically linked.
> I thought not crashing on code that doesn't need to warn would still be an 
> improvement.
> 
> The warning that's being lost doesn't seem all that serious. It's just 
> telling that an alwaysinline statement attribute has priority over a noinline 
> function attribute.
> 
> We don't warn for this
> 
> ```
> void foo();
> 
> void bar() {
>   [[clang::always_inline]] foo();
> }
> ```
> 
> If foo's definition is in another translation unit, the always_inline can't 
> happen without LTO. So foo is effectively noinline without LTO.
>>The warning that's being lost doesn't seem all that serious. It's just 
>>telling that an alwaysinline statement attribute has priority over a noinline 
>>function attribute.
Isn't it saying that the statement diagnostic is losing to the function 
attribute?

As far as that example, I wouldn't expect the diagnostic to show there, as you 
mentioned.

That said, I thought this was going to be a bit more trivial than it is, I 
thought this was going to be a mild drive-by.  There needs to be some level of 
extracting the getCallExprs checks in both cases into Sema, and have that 
called upon instantiation.

I think we're OK now with this, but PLEASE make sure to put a number of tests 
in for the template cases with a "FIXME".


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D146089

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

Reply via email to