================
@@ -4912,3 +4922,279 @@ void AutoType::Profile(llvm::FoldingSetNodeID &ID, 
const ASTContext &Context) {
   Profile(ID, Context, getDeducedType(), getKeyword(), isDependentType(),
           getTypeConstraintConcept(), getTypeConstraintArguments());
 }
+
+FunctionEffect::~FunctionEffect() = default;
+
+bool FunctionEffect::diagnoseConversion(bool Adding, QualType OldType,
+                                        FunctionEffectSet OldFX,
+                                        QualType NewType,
+                                        FunctionEffectSet NewFX) const {
+  return false;
+}
+
+bool FunctionEffect::diagnoseRedeclaration(bool Adding,
+                                           const FunctionDecl &OldFunction,
+                                           FunctionEffectSet OldFX,
+                                           const FunctionDecl &NewFunction,
+                                           FunctionEffectSet NewFX) const {
+  return false;
+}
+
+bool FunctionEffect::diagnoseMethodOverride(bool Adding,
+                                            const CXXMethodDecl &OldMethod,
+                                            FunctionEffectSet OldFX,
+                                            const CXXMethodDecl &NewMethod,
+                                            FunctionEffectSet NewFX) const {
+  return false;
+}
+
+bool FunctionEffect::canInferOnDecl(const Decl *Caller,
+                                    FunctionEffectSet CallerFX) const {
+  return false;
+}
+
+bool FunctionEffect::diagnoseFunctionCall(bool Direct, const Decl *Caller,
+                                          FunctionEffectSet CallerFX,
+                                          CalleeDeclOrType Callee,
+                                          FunctionEffectSet CalleeFX) const {
+  return false;
+}
+
+const NoLockNoAllocEffect &NoLockNoAllocEffect::nolock_instance() {
+  static NoLockNoAllocEffect global(kNoLockTrue, "nolock");
+  return global;
+}
----------------
Sirraide wrote:

With the `[[]]` syntax, attributes that appertain to a function declaration 
come before the return type, and attributes that appertain to the function type 
come after the parameter list, yeah.

Looking at this again, `AttributedType` makes sense for this, I’d say. 
`DeclOrTypeAttr` is probably fine for this, because I don’t think you can put a 
`TypeAttr` *before* a function if you want to be able to do that, but if you 
don’t care about that being possible, then a `TypeAttr` is probably simpler.

So, to get back to what this comment was originally about, if I understand the 
situation correctly, you can attach `nolock`/`noalloc` (optionally w/ an 
expression argument) to function types. This is done using `AttributedType`s, 
which makes sense. The presence/absence of these attributes may affect how 
effects are inferred.

At the same time, we would also like to track effects on the 
`FunctionProtoType`, so what I’m thinking is, it may it be possible to use only 
the attributes for inference, and track effects as a bitmask on the 
`FunctionProtoType` (see also the comment I made about this further down wrt 
one of the questions in your initial pr comment). With all of that in mind, 
it’s not quite clear to me what purpose the `nolock_instance()` serves in all 
of this?

https://github.com/llvm/llvm-project/pull/84983
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to