jdoerfert added inline comments.

================
Comment at: clang/include/clang/Sema/Sema.h:10333
+  /// Check if there is an active global `omp begin assumes` directive.
+  bool isInOpenMPAssumeScope() { return !OMPAssumeScoped.empty(); }
+
----------------
ABataev wrote:
> jdoerfert wrote:
> > ABataev wrote:
> > > jdoerfert wrote:
> > > > ABataev wrote:
> > > > > jdoerfert wrote:
> > > > > > ABataev wrote:
> > > > > > > ABataev wrote:
> > > > > > > > `const` member functions.
> > > > > > > It may have side-effects with template instantiations. What if we 
> > > > > > > have something like this:
> > > > > > > ```
> > > > > > > #pragma omp begin assumes ...
> > > > > > > template <typename T>
> > > > > > > struct S {
> > > > > > > ...
> > > > > > > }
> > > > > > > #pragma omp end assumes
> > > > > > > 
> > > > > > > void bar() {
> > > > > > > #pragma omp assumes ...
> > > > > > >   {
> > > > > > >     S<int> s;
> > > > > > >     s.foo();
> > > > > > >   }
> > > > > > > }
> > > > > > > ```
> > > > > > > ?
> > > > > > > 
> > > > > > > `struct S<int>` will be instantiated in the second assume region 
> > > > > > > context though I doubt this is the user intention.
> > > > > > I'm not sure what problem you expect here. Could you elaborate what 
> > > > > > you think should happen or should not?
> > > > > May it lead to the wrong compiler assumptions and result in the 
> > > > > incorrect codegen?
> > > > I'm still not following your example. What wrong assumptions and/or 
> > > > incorrect code generation do you expect? Could you provide an example 
> > > > with actual assumptions and then describe what the problem is please.
> > > Say, you have something like this:
> > > ```
> > > template <typename T>
> > > struct S {
> > >   int a;
> > >   void foo() {
> > >     #pragma omp parallel
> > >     ...
> > >   }
> > > };
> > > 
> > > void bar() {
> > > #pragma omp assumems no_openmp
> > >   S<int> s; // S<int> is instantiated here and function S<int>::foo() 
> > > gets no_openmp attribute.
> > >   s.a = 0; // S<int>::foo is instantiated here but not used and the 
> > > attribute no_openmp should not be propagated for this function.
> > > #pragma omp end assumes
> > > 
> > >   S<int> b; // S<int> already instantiated and S<int>::foo is 
> > > instantiated with attribute no_openmp
> > >   b.foo(); // calls function S<int>::foo with no_openmp attribute.
> > > }
> > > ```
> > > What do you think?
> > Thanks for the extra information. I'll add a test based on this for sure, 
> > no matter what we come up with for now.
> > 
> > ```
> > #pragma omp begin assumes no_openmp
> >   S<int> s; // S<int> is instantiated here and function S<int>::foo() gets 
> > no_openmp attribute.
> >   s.a = 0;
> > #pragma omp end assumes
> > ```
> > 
> > Hm, I guess the question is: 
> > Is `S<int>::foo()` a function defined in between the `begin`/`end` or not. 
> > If we say it is, the behavior right now seems consistent but the standard 
> > might need some clarifications. If we say it is not, we should not annotate 
> > it. Though, if it is not, where is it defined? I could avoid annotating 
> > template instantiations I guess. I might start with that. Update is coming.
> > 
> > 
> Yep, this is what I'm asking about. I would check С++ standard, I believe we 
> shall follow С++ rules here about the instantiation context.
I think the new solution, that is not to use scoped assumptions during template 
instantiations, is a conservative approximation of what people would assume and 
also matches the standard wrt. "defintition-declaration-seq". I included your 
example as a test.

WDYT?


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D91980

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

Reply via email to