================
@@ -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)) {
----------------
AaronBallman wrote:

> My point is that semantically a constructor has a return value, the user can 
> think of a constructor as a function that returns a value. And in the future 
> we may change the behavior so that marking the constructor 'pure' will make 
> sense.

I don't know if it's common for people to think of a constructor as a function 
that returns a value, but I can squint and see that line of thinking. CC 
@erichkeane for more opinions.

> This leads to just ignoring 'pure'/'const' on constructors without warning 
> now to make possible change it in future (but gcc thinks it is UB)

I think we can change it in the future either way, this is about diagnostic 
wording.

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

Reply via email to