[clang] Warning for incorrect useof 'pure' attribute (PR #78200)

Aaron Ballman via cfe-commits cfe-commits at lists.llvm.org
Wed Jan 17 06:11:35 PST 2024


================
@@ -11792,6 +11792,32 @@ static bool CheckMultiVersionFunction(Sema &S, FunctionDecl *NewFD,
                                          OldDecl, Previous);
 }
 
+static void CheckFunctionDeclarationAttributesUsage(Sema &S,
+                                                    FunctionDecl *NewFD) {
+  const bool is_pure = NewFD->hasAttr<PureAttr>();
+  const bool is_const = NewFD->hasAttr<ConstAttr>();
+
+  if (is_pure && is_const) {
+    S.Diag(NewFD->getLocation(), diag::warn_const_attr_with_pure_attr);
+    NewFD->dropAttr<PureAttr>();
+  }
+  if (is_pure || is_const) {
+    if (isa<CXXConstructorDecl>(NewFD)) {
+      // 'pure' constructor is an insidious error:
+      // while constructor semantically 'returns' object
+      // but it should modify memory by implicit 'this' pointer
+      S.Diag(NewFD->getLocation(), diag::warn_pure_attr_on_cxx_constructor)
+          << (is_const ? 1 : 0);
----------------
AaronBallman wrote:

```suggestion
      S.Diag(NewFD->getLocation(), diag::warn_pure_attr_on_cxx_constructor)
          << IsConst;
```

https://github.com/llvm/llvm-project/pull/78200


More information about the cfe-commits mailing list