[clang] [clang][doc] Improve error handling for `LibTooling` example code avoiding core dump (PR #98129)

2024-07-10 Thread Rajveer Singh Bharadwaj via cfe-commits

Rajveer100 wrote:

> Sure. Do I need to do anything?

I don't have the access rights to merge yet.

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


[clang] [clang][doc] Improve error handling for `LibTooling` example code avoiding core dump (PR #98129)

2024-07-09 Thread Rajveer Singh Bharadwaj via cfe-commits

Rajveer100 wrote:

@nickhuang99 
Could you land this for me?

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


[clang] [clang][doc] Improve error handling for `LibTooling` example code avoiding core dump (PR #98129)

2024-07-09 Thread Rajveer Singh Bharadwaj via cfe-commits

https://github.com/Rajveer100 created 
https://github.com/llvm/llvm-project/pull/98129

Resolves #97983

>From e20e592845a1de4282e7492bec2e2b34ac3b96cf Mon Sep 17 00:00:00 2001
From: Rajveer 
Date: Tue, 9 Jul 2024 13:58:20 +0530
Subject: [PATCH] [clang][doc] Improve error handling for `LibTooling` example
 code avoiding core dump

Resolves #97983
---
 clang/docs/LibTooling.rst | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/clang/docs/LibTooling.rst b/clang/docs/LibTooling.rst
index 87d84321ab283..c6687fb9642f9 100644
--- a/clang/docs/LibTooling.rst
+++ b/clang/docs/LibTooling.rst
@@ -75,7 +75,7 @@ and automatic location of the compilation database using 
source files paths.
 auto ExpectedParser = CommonOptionsParser::create(argc, argv, 
MyToolCategory);
 if (!ExpectedParser) {
   // Fail gracefully for unsupported options.
-  llvm::errs() << ExpectedParser.takeError();
+  llvm::errs() << toString(ExpectedParser.takeError());
   return 1;
 }
 CommonOptionsParser& OptionsParser = ExpectedParser.get();
@@ -142,7 +142,7 @@ version of this example tool is also checked into the clang 
tree at
   int main(int argc, const char **argv) {
 auto ExpectedParser = CommonOptionsParser::create(argc, argv, 
MyToolCategory);
 if (!ExpectedParser) {
-  llvm::errs() << ExpectedParser.takeError();
+  llvm::errs() << toString(ExpectedParser.takeError());
   return 1;
 }
 CommonOptionsParser& OptionsParser = ExpectedParser.get();

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


[clang] [clang] Allow class with anonymous union member to be const-default-constructible even if a union member has a default member initializer (#95854) (PR #96301)

2024-07-05 Thread Rajveer Singh Bharadwaj via cfe-commits

Rajveer100 wrote:

@zygoloid 
Let me know if the new changes work well.

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


[clang] [clang] Allow class with anonymous union member to be const-default-constructible even if a union member has a default member initializer (#95854) (PR #96301)

2024-07-05 Thread Rajveer Singh Bharadwaj via cfe-commits

https://github.com/Rajveer100 updated 
https://github.com/llvm/llvm-project/pull/96301

>From 751e630dbf54ef6f3a1209a5d09f99093ad84cae Mon Sep 17 00:00:00 2001
From: Rajveer 
Date: Fri, 21 Jun 2024 18:26:36 +0530
Subject: [PATCH] [clang] Allow class with anonymous union member to be
 const-default-constructible even if a union member has a default member
 initializer (#95854)

Resolves #95854

  Clang incorrectly considers a class with an anonymous union member to not be
  const-default-constructible even if a union member has a default member 
initializer.
  This is valid as per ``8.3`` in `Draft C++ Standard 
`_.
  The ``allowConstDefaultInit`` member function in ``CXXRecordDecl`` needs
  special-case unions to handle the rule. (#GH95854).

```
struct A {
  union {
int n = 0;
int m;
  };
};
const A a;
```

-- As per https://eel.is/c++draft/dcl.init#general-8.3
---
 clang/docs/ReleaseNotes.rst   |  6 ++
 clang/include/clang/AST/DeclCXX.h |  3 ++-
 clang/lib/AST/DeclCXX.cpp |  9 -
 clang/test/SemaCXX/GH95854.cpp| 21 +
 4 files changed, 37 insertions(+), 2 deletions(-)
 create mode 100644 clang/test/SemaCXX/GH95854.cpp

diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 36cf615a4287cc..35259760adc60f 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -756,6 +756,12 @@ Bug Fixes in This Version
 
 - ``__is_array`` and ``__is_bounded_array`` no longer return ``true`` for
   zero-sized arrays. Fixes (#GH54705).
+  
+- Clang incorrectly considers a class with an anonymous union member to not be 
+  const-default-constructible even if a union member has a default member 
initializer. 
+  This is valid as per ``8.3`` in `Draft C++ Standard 
`_.
+  The ``allowConstDefaultInit`` member function in ``CXXRecordDecl`` needs 
+  special-case unions to handle the rule. (#GH95854).
 
 - Correctly reject declarations where a statement is required in C.
   Fixes #GH92775
diff --git a/clang/include/clang/AST/DeclCXX.h 
b/clang/include/clang/AST/DeclCXX.h
index fb52ac804849d8..f4d90e19e0e05e 100644
--- a/clang/include/clang/AST/DeclCXX.h
+++ b/clang/include/clang/AST/DeclCXX.h
@@ -1392,7 +1392,8 @@ class CXXRecordDecl : public RecordDecl {
   bool allowConstDefaultInit() const {
 return !data().HasUninitializedFields ||
!(data().HasDefaultedDefaultConstructor ||
- needsImplicitDefaultConstructor());
+ needsImplicitDefaultConstructor()) ||
+   (isUnion() && isEmpty());
   }
 
   /// Determine whether this class has a destructor which has no
diff --git a/clang/lib/AST/DeclCXX.cpp b/clang/lib/AST/DeclCXX.cpp
index d5c140fd343895..16f0a2b4592ed0 100644
--- a/clang/lib/AST/DeclCXX.cpp
+++ b/clang/lib/AST/DeclCXX.cpp
@@ -1018,6 +1018,9 @@ void CXXRecordDecl::addedMember(Decl *D) {
 if (isUnion() && !Field->isAnonymousStructOrUnion())
   data().HasVariantMembers = true;
 
+if (isUnion() && IsFirstField)
+  data().HasUninitializedFields = true;
+
 // C++0x [class]p9:
 //   A POD struct is a class that is both a trivial class and a
 //   standard-layout class, and has no non-static data members of type
@@ -1086,7 +1089,11 @@ void CXXRecordDecl::addedMember(Decl *D) {
 data().DefaultedCopyConstructorIsDeleted = true;
 }
 
-if (!Field->hasInClassInitializer() && !Field->isMutable()) {
+if (isUnion() && !Field->isMutable()) {
+  if (Field->hasInClassInitializer()) {
+data().HasUninitializedFields = false;
+  }
+} else if (!Field->hasInClassInitializer() && !Field->isMutable()) {
   if (CXXRecordDecl *FieldType = T->getAsCXXRecordDecl()) {
 if (FieldType->hasDefinition() && !FieldType->allowConstDefaultInit())
   data().HasUninitializedFields = true;
diff --git a/clang/test/SemaCXX/GH95854.cpp b/clang/test/SemaCXX/GH95854.cpp
new file mode 100644
index 00..62ae549f2496f0
--- /dev/null
+++ b/clang/test/SemaCXX/GH95854.cpp
@@ -0,0 +1,21 @@
+// RUN: %clang_cc1 -std=c++23 -fsyntax-only -verify %s
+//
+// -expected-no-diagnostics
+
+struct A {
+  union {
+int n = 0;
+int m;
+  };
+};
+const A a;
+
+struct B {
+  union {
+struct {
+  int n = 5;
+  int m;
+};
+  };
+};
+const B b; // expected-error {{default initialization of an object of const 
type 'const B' without a user-provided default constructor}}

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


[clang] [clang] Allow class with anonymous union member to be const-default-constructible even if a union member has a default member initializer (#95854) (PR #96301)

2024-07-05 Thread Rajveer Singh Bharadwaj via cfe-commits

https://github.com/Rajveer100 updated 
https://github.com/llvm/llvm-project/pull/96301

>From 3fb29e52b7227c2778942b3ca941112596ce89c1 Mon Sep 17 00:00:00 2001
From: Rajveer 
Date: Fri, 21 Jun 2024 18:26:36 +0530
Subject: [PATCH] [clang] Allow class with anonymous union member to be
 const-default-constructible even if a union member has a default member
 initializer (#95854)

Resolves #95854

  Clang incorrectly considers a class with an anonymous union member to not be
  const-default-constructible even if a union member has a default member 
initializer.
  This is valid as per ``8.3`` in `Draft C++ Standard 
`_.
  The ``allowConstDefaultInit`` member function in ``CXXRecordDecl`` needs
  special-case unions to handle the rule. (#GH95854).

```
struct A {
  union {
int n = 0;
int m;
  };
};
const A a;
```

-- As per https://eel.is/c++draft/dcl.init#general-8.3
---
 clang/docs/ReleaseNotes.rst   |  6 ++
 clang/include/clang/AST/DeclCXX.h |  3 ++-
 clang/lib/AST/DeclCXX.cpp |  9 -
 clang/test/SemaCXX/GH95854.cpp| 21 +
 4 files changed, 37 insertions(+), 2 deletions(-)
 create mode 100644 clang/test/SemaCXX/GH95854.cpp

diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 45676a02b760b..c107304ea95f7 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -624,6 +624,12 @@ Bug Fixes in This Version
 
 - ``__is_array`` and ``__is_bounded_array`` no longer return ``true`` for
   zero-sized arrays. Fixes (#GH54705).
+  
+- Clang incorrectly considers a class with an anonymous union member to not be 
+  const-default-constructible even if a union member has a default member 
initializer. 
+  This is valid as per ``8.3`` in `Draft C++ Standard 
`_.
+  The ``allowConstDefaultInit`` member function in ``CXXRecordDecl`` needs 
+  special-case unions to handle the rule. (#GH95854).
 
 Bug Fixes to Compiler Builtins
 ^^
diff --git a/clang/include/clang/AST/DeclCXX.h 
b/clang/include/clang/AST/DeclCXX.h
index fb52ac804849d..f4d90e19e0e05 100644
--- a/clang/include/clang/AST/DeclCXX.h
+++ b/clang/include/clang/AST/DeclCXX.h
@@ -1392,7 +1392,8 @@ class CXXRecordDecl : public RecordDecl {
   bool allowConstDefaultInit() const {
 return !data().HasUninitializedFields ||
!(data().HasDefaultedDefaultConstructor ||
- needsImplicitDefaultConstructor());
+ needsImplicitDefaultConstructor()) ||
+   (isUnion() && isEmpty());
   }
 
   /// Determine whether this class has a destructor which has no
diff --git a/clang/lib/AST/DeclCXX.cpp b/clang/lib/AST/DeclCXX.cpp
index 75c441293d62e..0b963cb305d27 100644
--- a/clang/lib/AST/DeclCXX.cpp
+++ b/clang/lib/AST/DeclCXX.cpp
@@ -1018,6 +1018,9 @@ void CXXRecordDecl::addedMember(Decl *D) {
 if (isUnion() && !Field->isAnonymousStructOrUnion())
   data().HasVariantMembers = true;
 
+if (isUnion() && IsFirstField)
+  data().HasUninitializedFields = true;
+
 // C++0x [class]p9:
 //   A POD struct is a class that is both a trivial class and a
 //   standard-layout class, and has no non-static data members of type
@@ -1086,7 +1089,11 @@ void CXXRecordDecl::addedMember(Decl *D) {
 data().DefaultedCopyConstructorIsDeleted = true;
 }
 
-if (!Field->hasInClassInitializer() && !Field->isMutable()) {
+if (isUnion() && !Field->isMutable()) {
+  if (Field->hasInClassInitializer()) {
+data().HasUninitializedFields = false;
+  }
+} else if (!Field->hasInClassInitializer() && !Field->isMutable()) {
   if (CXXRecordDecl *FieldType = T->getAsCXXRecordDecl()) {
 if (FieldType->hasDefinition() && !FieldType->allowConstDefaultInit())
   data().HasUninitializedFields = true;
diff --git a/clang/test/SemaCXX/GH95854.cpp b/clang/test/SemaCXX/GH95854.cpp
new file mode 100644
index 0..62ae549f2496f
--- /dev/null
+++ b/clang/test/SemaCXX/GH95854.cpp
@@ -0,0 +1,21 @@
+// RUN: %clang_cc1 -std=c++23 -fsyntax-only -verify %s
+//
+// -expected-no-diagnostics
+
+struct A {
+  union {
+int n = 0;
+int m;
+  };
+};
+const A a;
+
+struct B {
+  union {
+struct {
+  int n = 5;
+  int m;
+};
+  };
+};
+const B b; // expected-error {{default initialization of an object of const 
type 'const B' without a user-provided default constructor}}

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


[clang] [clang] Allow class with anonymous union member to be const-default-constructible even if a union member has a default member initializer (#95854) (PR #96301)

2024-06-25 Thread Rajveer Singh Bharadwaj via cfe-commits

https://github.com/Rajveer100 edited 
https://github.com/llvm/llvm-project/pull/96301
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [clang] Allow class with anonymous union member to be const-default-constructible even if a union member has a default member initializer (#95854) (PR #96301)

2024-06-25 Thread Rajveer Singh Bharadwaj via cfe-commits


@@ -1392,7 +1392,8 @@ class CXXRecordDecl : public RecordDecl {
   bool allowConstDefaultInit() const {
 return !data().HasUninitializedFields ||
!(data().HasDefaultedDefaultConstructor ||
- needsImplicitDefaultConstructor());
+ needsImplicitDefaultConstructor()) ||
+   hasInClassInitializer();

Rajveer100 wrote:

@zygoloid 
Is there an existing method for checking nested structures for cases like you 
mentioned above?

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


[clang] [clang] Allow class with anonymous union member to be const-default-constructible even if a union member has a default member initializer (#95854) (PR #96301)

2024-06-22 Thread Rajveer Singh Bharadwaj via cfe-commits

https://github.com/Rajveer100 updated 
https://github.com/llvm/llvm-project/pull/96301

>From b964923b9610c9cd53e4d1de8f5d51d8fcebc78c Mon Sep 17 00:00:00 2001
From: Rajveer 
Date: Fri, 21 Jun 2024 18:26:36 +0530
Subject: [PATCH] [clang] Allow class with anonymous union member to be
 const-default-constructible even if a union member has a default member
 initializer (#95854)

Resolves #95854

Clang incorrectly considers a class with an anonymous union member to not be
  const-default-constructible even if a union member has a default member 
initializer.
  This is valid as per ``8.3`` in `Draft C++ Standard 
`_.
  The ``allowConstDefaultInit`` member function in ``CXXRecordDecl`` needs
  special-case unions to handle the rule. (#GH95854).

```
struct A {
  union {
int n = 0;
int m;
  };
};
const A a;
```

-- As per https://eel.is/c++draft/dcl.init#general-8.3
---
 clang/docs/ReleaseNotes.rst   |  6 ++
 clang/include/clang/AST/DeclCXX.h |  4 +++-
 clang/test/SemaCXX/GH95854.cpp| 21 +
 3 files changed, 30 insertions(+), 1 deletion(-)
 create mode 100644 clang/test/SemaCXX/GH95854.cpp

diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 45676a02b760b..c107304ea95f7 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -624,6 +624,12 @@ Bug Fixes in This Version
 
 - ``__is_array`` and ``__is_bounded_array`` no longer return ``true`` for
   zero-sized arrays. Fixes (#GH54705).
+  
+- Clang incorrectly considers a class with an anonymous union member to not be 
+  const-default-constructible even if a union member has a default member 
initializer. 
+  This is valid as per ``8.3`` in `Draft C++ Standard 
`_.
+  The ``allowConstDefaultInit`` member function in ``CXXRecordDecl`` needs 
+  special-case unions to handle the rule. (#GH95854).
 
 Bug Fixes to Compiler Builtins
 ^^
diff --git a/clang/include/clang/AST/DeclCXX.h 
b/clang/include/clang/AST/DeclCXX.h
index fb52ac804849d..e4dc50c9b9e00 100644
--- a/clang/include/clang/AST/DeclCXX.h
+++ b/clang/include/clang/AST/DeclCXX.h
@@ -1392,7 +1392,9 @@ class CXXRecordDecl : public RecordDecl {
   bool allowConstDefaultInit() const {
 return !data().HasUninitializedFields ||
!(data().HasDefaultedDefaultConstructor ||
- needsImplicitDefaultConstructor());
+ needsImplicitDefaultConstructor()) ||
+   (!hasUninitializedReferenceMember() && isUnion() &&
+hasInClassInitializer());
   }
 
   /// Determine whether this class has a destructor which has no
diff --git a/clang/test/SemaCXX/GH95854.cpp b/clang/test/SemaCXX/GH95854.cpp
new file mode 100644
index 0..820cf15e68287
--- /dev/null
+++ b/clang/test/SemaCXX/GH95854.cpp
@@ -0,0 +1,21 @@
+// RUN: %clang_cc1 -std=c++23 -fsyntax-only -verify %s
+//
+// expected-no-diagnostics
+
+struct A {
+  union {
+int n = 0;
+int m;
+  };
+};
+const A a;
+
+struct B {
+  union {
+struct {
+  int n = 5;
+  int m;
+};
+  };
+};
+const B b;

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


[clang] [clang] Allow class with anonymous union member to be const-default-constructible even if a union member has a default member initializer (#95854) (PR #96301)

2024-06-22 Thread Rajveer Singh Bharadwaj via cfe-commits


@@ -1392,7 +1392,8 @@ class CXXRecordDecl : public RecordDecl {
   bool allowConstDefaultInit() const {
 return !data().HasUninitializedFields ||
!(data().HasDefaultedDefaultConstructor ||
- needsImplicitDefaultConstructor());
+ needsImplicitDefaultConstructor()) ||
+   hasInClassInitializer();

Rajveer100 wrote:

The two tests that were broken:

```c++
struct some_init {
  int a = 0;
  int b;
  int c = 0;
};

void constobjs() {
  // ...
  const some_init si;
  // ...
}
```

```c++
struct Ints2 {
  int a = 10;
  int b;
};
constexpr Ints2 ints22;
```

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


[clang] [clang] Allow class with anonymous union member to be const-default-constructible even if a union member has a default member initializer (#95854) (PR #96301)

2024-06-22 Thread Rajveer Singh Bharadwaj via cfe-commits


@@ -0,0 +1,11 @@
+// RUN: %clang_cc1 -std=c++23 -fsyntax-only -verify %s

Rajveer100 wrote:

Indeed.

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


[clang] [clang] Allow class with anonymous union member to be const-default-constructible even if a union member has a default member initializer (#95854) (PR #96301)

2024-06-22 Thread Rajveer Singh Bharadwaj via cfe-commits


@@ -1392,7 +1392,8 @@ class CXXRecordDecl : public RecordDecl {
   bool allowConstDefaultInit() const {
 return !data().HasUninitializedFields ||
!(data().HasDefaultedDefaultConstructor ||
- needsImplicitDefaultConstructor());
+ needsImplicitDefaultConstructor()) ||
+   hasInClassInitializer();

Rajveer100 wrote:

> This is a language extension so we get to choose its semantics, but I think 
> the most logical choice is to reject because the union member is not _fully_ 
> initialized.

At the moment, this gets accepted.

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


[clang] [clang] Allow class with anonymous union member to be const-default-constructible even if a union member has a default member initializer (#95854) (PR #96301)

2024-06-21 Thread Rajveer Singh Bharadwaj via cfe-commits

Rajveer100 wrote:

@zygoloid 

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


[clang] [clang] Allow class with anonymous union member to be const-default-constructible even if a union member has a default member initializer (#95854) (PR #96301)

2024-06-21 Thread Rajveer Singh Bharadwaj via cfe-commits

https://github.com/Rajveer100 created 
https://github.com/llvm/llvm-project/pull/96301

Resolves #95854

-- As per https://eel.is/c++draft/dcl.init#general-8.3

>From c8f2496e91d58c8704911665e1bf1dd7dfbb1d2e Mon Sep 17 00:00:00 2001
From: Rajveer 
Date: Fri, 21 Jun 2024 18:26:36 +0530
Subject: [PATCH] [clang] Allow class with anonymous union member to be
 const-default-constructible even if a union member has a default member
 initializer (#95854)

Resolves #95854

-- As per https://eel.is/c++draft/dcl.init#general-8.3
---
 clang/include/clang/AST/DeclCXX.h |  3 ++-
 clang/test/Sema/debug-95854.cpp   | 11 +++
 2 files changed, 13 insertions(+), 1 deletion(-)
 create mode 100644 clang/test/Sema/debug-95854.cpp

diff --git a/clang/include/clang/AST/DeclCXX.h 
b/clang/include/clang/AST/DeclCXX.h
index fb52ac804849d..1d1083a5d6205 100644
--- a/clang/include/clang/AST/DeclCXX.h
+++ b/clang/include/clang/AST/DeclCXX.h
@@ -1392,7 +1392,8 @@ class CXXRecordDecl : public RecordDecl {
   bool allowConstDefaultInit() const {
 return !data().HasUninitializedFields ||
!(data().HasDefaultedDefaultConstructor ||
- needsImplicitDefaultConstructor());
+ needsImplicitDefaultConstructor()) ||
+   hasInClassInitializer();
   }
 
   /// Determine whether this class has a destructor which has no
diff --git a/clang/test/Sema/debug-95854.cpp b/clang/test/Sema/debug-95854.cpp
new file mode 100644
index 0..1fb976558650d
--- /dev/null
+++ b/clang/test/Sema/debug-95854.cpp
@@ -0,0 +1,11 @@
+// RUN: %clang_cc1 -std=c++23 -fsyntax-only -verify %s
+//
+// expected-no-diagnostics
+
+struct A {
+  union {
+int n = 0;
+int m;
+  };
+};
+const A a;

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


[clang] [clang] Fix-it hint for `++this` -> `++*this` when deref is modifiable (PR #94159)

2024-06-18 Thread Rajveer Singh Bharadwaj via cfe-commits

Rajveer100 wrote:

@Sirraide @zygoloid 
Can I be of any help to improve this?


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


[clang] [clang] Fix-it hint for `++this` -> `++*this` when deref is modifiable (PR #94159)

2024-06-11 Thread Rajveer Singh Bharadwaj via cfe-commits

Rajveer100 wrote:

@Sirraide 
Can you land this for me?

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


[clang] [clang] Fix-it hint for `++this` -> `++*this` when deref is modifiable (PR #94159)

2024-06-11 Thread Rajveer Singh Bharadwaj via cfe-commits

Rajveer100 wrote:

I have done the last few changes as well.

Regarding the force-push, I will try to do single commits and later squash them!

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


[clang] [clang] Fix-it hint for `++this` -> `++*this` when deref is modifiable (PR #94159)

2024-06-11 Thread Rajveer Singh Bharadwaj via cfe-commits

https://github.com/Rajveer100 updated 
https://github.com/llvm/llvm-project/pull/94159

>From bf114654e02d4723457730de0d067c7a00abf42d Mon Sep 17 00:00:00 2001
From: Rajveer 
Date: Sun, 2 Jun 2024 18:33:37 +0530
Subject: [PATCH] [clang] Fix-it hint for `++this` -> `++*this` when deref is
 modifiable

Resolves #93066
---
 .../clang/Basic/DiagnosticSemaKinds.td|  3 ++
 clang/lib/Sema/SemaExpr.cpp   | 24 -
 clang/test/C/drs/dr1xx.c  |  1 +
 clang/test/Sema/debug-93066.cpp   | 49 +++
 clang/test/Sema/exprs.c   |  2 +
 clang/test/Sema/va_arg_x86_32.c   |  1 +
 clang/test/SemaObjCXX/sel-address.mm  | 13 +
 7 files changed, 91 insertions(+), 2 deletions(-)
 create mode 100644 clang/test/Sema/debug-93066.cpp

diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td 
b/clang/include/clang/Basic/DiagnosticSemaKinds.td
index 270b0a1e01307..986d454decab6 100644
--- a/clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -8777,6 +8777,9 @@ def err_typecheck_incomplete_type_not_modifiable_lvalue : 
Error<
 def err_typecheck_lvalue_casts_not_supported : Error<
   "assignment to cast is illegal, lvalue casts are not supported">;
 
+def note_typecheck_add_deref_star_not_modifiable_lvalue : Note<
+  "add '*' to dereference it">; 
+
 def err_typecheck_duplicate_vector_components_not_mlvalue : Error<
   "vector is not assignable (contains duplicate components)">;
 def err_block_decl_ref_not_modifiable_lvalue : Error<
diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp
index ff9c5ead36dcf..2211242794118 100644
--- a/clang/lib/Sema/SemaExpr.cpp
+++ b/clang/lib/Sema/SemaExpr.cpp
@@ -13273,6 +13273,23 @@ enum {
   ConstUnknown,  // Keep as last element
 };
 
+static void MaybeSuggestDerefFixIt(Sema , const Expr *E, SourceLocation Loc) 
{
+  ExprResult Deref;
+  Expr *TE = const_cast(E);
+  {
+Sema::TentativeAnalysisScope Trap(S);
+Deref = S.ActOnUnaryOp(S.getCurScope(), Loc, tok::star, TE);
+  }
+  if (Deref.isUsable() &&
+  Deref.get()->isModifiableLvalue(S.Context, ) == Expr::MLV_Valid &&
+  !E->getType()->isObjCObjectPointerType()) {
+S.Diag(E->getBeginLoc(),
+   diag::note_typecheck_add_deref_star_not_modifiable_lvalue)
+<< E->getSourceRange()
+<< FixItHint::CreateInsertion(E->getBeginLoc(), "*");
+  }
+}
+
 /// Emit the "read-only variable not assignable" error and print notes to give
 /// more information about why the variable is not assignable, such as pointing
 /// to the declaration of a const variable, showing that a method is const, or
@@ -13367,6 +13384,7 @@ static void DiagnoseConstAssignment(Sema , const Expr 
*E,
 if (!DiagnosticEmitted) {
   S.Diag(Loc, diag::err_typecheck_assign_const)
   << ExprRange << ConstVariable << VD << VD->getType();
+  MaybeSuggestDerefFixIt(S, E, Loc);
   DiagnosticEmitted = true;
 }
 S.Diag(VD->getLocation(), diag::note_typecheck_assign_const)
@@ -13587,10 +13605,12 @@ static bool CheckForModifiableLvalue(Expr *E, 
SourceLocation Loc, Sema ) {
   SourceRange Assign;
   if (Loc != OrigLoc)
 Assign = SourceRange(OrigLoc, OrigLoc);
-  if (NeedType)
+  if (NeedType) {
 S.Diag(Loc, DiagID) << E->getType() << E->getSourceRange() << Assign;
-  else
+  } else {
 S.Diag(Loc, DiagID) << E->getSourceRange() << Assign;
+MaybeSuggestDerefFixIt(S, E, Loc);
+  }
   return true;
 }
 
diff --git a/clang/test/C/drs/dr1xx.c b/clang/test/C/drs/dr1xx.c
index 47538e44428c3..20e953b2c20ac 100644
--- a/clang/test/C/drs/dr1xx.c
+++ b/clang/test/C/drs/dr1xx.c
@@ -296,6 +296,7 @@ void dr126(void) {
*/
   *object = 12; /* ok */
   ++object; /* expected-error {{cannot assign to variable 'object' with 
const-qualified type 'const IP' (aka 'int *const')}} */
+  /* expected-note@-1 {{add '*' to dereference it}} */
 }
 
 /* WG14 DR128: yes
diff --git a/clang/test/Sema/debug-93066.cpp b/clang/test/Sema/debug-93066.cpp
new file mode 100644
index 0..e64d378e6f90d
--- /dev/null
+++ b/clang/test/Sema/debug-93066.cpp
@@ -0,0 +1,49 @@
+// RUN: %clang_cc1 -std=c++23 -fsyntax-only -verify %s
+
+struct S {
+  void f() {
+++this; // expected-error {{expression is not assignable}}
+// expected-note@-1 {{add '*' to dereference it}}
+  }
+
+  void g() const {
+++this; // expected-error {{expression is not assignable}}
+  }
+};
+
+void f(int* a, int* const b, const int* const c, __UINTPTR_TYPE__ d) {
+  // expected-note@-1 {{variable 'b' declared const here}}
+  // expected-note@-2 {{variable 'c' declared const here}}
+  (int*)d = 4; // expected-error {{assignment to cast is illegal, lvalue casts 
are not supported}}
+  // expected-note@-1 {{add '*' to dereference it}}
+
+  ++a;
+  ++b; // expected-error {{cannot assign to variable 'b' with const-qualified 
type 'int *const'}}
+  // 

[clang] [clang] Fix-it hint for `++this` -> `++*this` when deref is modifiable (PR #94159)

2024-06-11 Thread Rajveer Singh Bharadwaj via cfe-commits


@@ -0,0 +1,49 @@
+// RUN: %clang_cc1 -std=c++23 -fsyntax-only -verify %s
+
+struct S {
+  void f() {
+++this; // expected-error {{expression is not assignable}}
+// expected-note@-1 {{add '*' to dereference it}}
+  }
+
+  void g() const {
+++this; // expected-error {{expression is not assignable}}
+  }
+};
+
+void f(int* a, int* const b, const int* const c, __UINTPTR_TYPE__ d) {
+  (int*)d = 4; // expected-error {{assignment to cast is illegal, lvalue casts 
are not supported}}
+  // expected-note@-1 {{add '*' to dereference it}}
+
+  ++a;
+  ++b; // expected-error {{cannot assign to variable 'b' with const-qualified 
type 'int *const'}}
+  // expected-note@-1 {{add '*' to dereference it}}
+  // expected-note@* {{variable 'b' declared const here}}

Rajveer100 wrote:

Oh yeah, I was actually gonna do that.

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


[clang] [clang] Fix-it hint for `++this` -> `++*this` when deref is modifiable (PR #94159)

2024-06-11 Thread Rajveer Singh Bharadwaj via cfe-commits


@@ -13273,6 +13273,22 @@ enum {
   ConstUnknown,  // Keep as last element
 };
 
+static void MaybeSuggestDerefFixIt(Sema , const Expr *E, SourceLocation Loc) 
{
+  ExprResult Deref;
+  Expr *TE = const_cast(E);
+  {
+Sema::TentativeAnalysisScope Trap(S);
+Deref = S.ActOnUnaryOp(S.getCurScope(), Loc, tok::star, TE);
+  }
+  if (Deref.isUsable() &&
+  Deref.get()->isModifiableLvalue(S.Context, ) == Expr::MLV_Valid &&
+  !E->getType()->isObjCObjectPointerType()) {
+S.Diag(Loc, diag::note_typecheck_add_deref_star_not_modifiable_lvalue)

Rajveer100 wrote:

Sure thing!

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


[clang] [clang] Fix-it hint for `++this` -> `++*this` when deref is modifiable (PR #94159)

2024-06-11 Thread Rajveer Singh Bharadwaj via cfe-commits

https://github.com/Rajveer100 updated 
https://github.com/llvm/llvm-project/pull/94159

>From 765176a735a922c404502c927338d90853335923 Mon Sep 17 00:00:00 2001
From: Rajveer 
Date: Sun, 2 Jun 2024 18:33:37 +0530
Subject: [PATCH] [clang] Fix-it hint for `++this` -> `++*this` when deref is
 modifiable

Resolves #93066
---
 .../clang/Basic/DiagnosticSemaKinds.td|  3 ++
 clang/lib/Sema/SemaExpr.cpp   | 23 -
 clang/test/C/drs/dr1xx.c  |  1 +
 clang/test/Sema/debug-93066.cpp   | 49 +++
 clang/test/Sema/exprs.c   |  2 +
 clang/test/Sema/va_arg_x86_32.c   |  1 +
 clang/test/SemaObjCXX/sel-address.mm  | 13 +
 7 files changed, 90 insertions(+), 2 deletions(-)
 create mode 100644 clang/test/Sema/debug-93066.cpp

diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td 
b/clang/include/clang/Basic/DiagnosticSemaKinds.td
index 270b0a1e01307..986d454decab6 100644
--- a/clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -8777,6 +8777,9 @@ def err_typecheck_incomplete_type_not_modifiable_lvalue : 
Error<
 def err_typecheck_lvalue_casts_not_supported : Error<
   "assignment to cast is illegal, lvalue casts are not supported">;
 
+def note_typecheck_add_deref_star_not_modifiable_lvalue : Note<
+  "add '*' to dereference it">; 
+
 def err_typecheck_duplicate_vector_components_not_mlvalue : Error<
   "vector is not assignable (contains duplicate components)">;
 def err_block_decl_ref_not_modifiable_lvalue : Error<
diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp
index ff9c5ead36dcf..b585d1c0270b9 100644
--- a/clang/lib/Sema/SemaExpr.cpp
+++ b/clang/lib/Sema/SemaExpr.cpp
@@ -13273,6 +13273,22 @@ enum {
   ConstUnknown,  // Keep as last element
 };
 
+static void MaybeSuggestDerefFixIt(Sema , const Expr *E, SourceLocation Loc) 
{
+  ExprResult Deref;
+  Expr *TE = const_cast(E);
+  {
+Sema::TentativeAnalysisScope Trap(S);
+Deref = S.ActOnUnaryOp(S.getCurScope(), Loc, tok::star, TE);
+  }
+  if (Deref.isUsable() &&
+  Deref.get()->isModifiableLvalue(S.Context, ) == Expr::MLV_Valid &&
+  !E->getType()->isObjCObjectPointerType()) {
+S.Diag(Loc, diag::note_typecheck_add_deref_star_not_modifiable_lvalue)
+<< E->getSourceRange()
+<< FixItHint::CreateInsertion(E->getBeginLoc(), "*");
+  }
+}
+
 /// Emit the "read-only variable not assignable" error and print notes to give
 /// more information about why the variable is not assignable, such as pointing
 /// to the declaration of a const variable, showing that a method is const, or
@@ -13367,6 +13383,7 @@ static void DiagnoseConstAssignment(Sema , const Expr 
*E,
 if (!DiagnosticEmitted) {
   S.Diag(Loc, diag::err_typecheck_assign_const)
   << ExprRange << ConstVariable << VD << VD->getType();
+  MaybeSuggestDerefFixIt(S, E, Loc);
   DiagnosticEmitted = true;
 }
 S.Diag(VD->getLocation(), diag::note_typecheck_assign_const)
@@ -13587,10 +13604,12 @@ static bool CheckForModifiableLvalue(Expr *E, 
SourceLocation Loc, Sema ) {
   SourceRange Assign;
   if (Loc != OrigLoc)
 Assign = SourceRange(OrigLoc, OrigLoc);
-  if (NeedType)
+  if (NeedType) {
 S.Diag(Loc, DiagID) << E->getType() << E->getSourceRange() << Assign;
-  else
+  } else {
 S.Diag(Loc, DiagID) << E->getSourceRange() << Assign;
+MaybeSuggestDerefFixIt(S, E, Loc);
+  }
   return true;
 }
 
diff --git a/clang/test/C/drs/dr1xx.c b/clang/test/C/drs/dr1xx.c
index 47538e44428c3..20e953b2c20ac 100644
--- a/clang/test/C/drs/dr1xx.c
+++ b/clang/test/C/drs/dr1xx.c
@@ -296,6 +296,7 @@ void dr126(void) {
*/
   *object = 12; /* ok */
   ++object; /* expected-error {{cannot assign to variable 'object' with 
const-qualified type 'const IP' (aka 'int *const')}} */
+  /* expected-note@-1 {{add '*' to dereference it}} */
 }
 
 /* WG14 DR128: yes
diff --git a/clang/test/Sema/debug-93066.cpp b/clang/test/Sema/debug-93066.cpp
new file mode 100644
index 0..48c5f9e27c211
--- /dev/null
+++ b/clang/test/Sema/debug-93066.cpp
@@ -0,0 +1,49 @@
+// RUN: %clang_cc1 -std=c++23 -fsyntax-only -verify %s
+
+struct S {
+  void f() {
+++this; // expected-error {{expression is not assignable}}
+// expected-note@-1 {{add '*' to dereference it}}
+  }
+
+  void g() const {
+++this; // expected-error {{expression is not assignable}}
+  }
+};
+
+void f(int* a, int* const b, const int* const c, __UINTPTR_TYPE__ d) {
+  (int*)d = 4; // expected-error {{assignment to cast is illegal, lvalue casts 
are not supported}}
+  // expected-note@-1 {{add '*' to dereference it}}
+
+  ++a;
+  ++b; // expected-error {{cannot assign to variable 'b' with const-qualified 
type 'int *const'}}
+  // expected-note@-1 {{add '*' to dereference it}}
+  // expected-note@* {{variable 'b' declared const here}}
+  ++c; // expected-error {{cannot 

[clang] [clang] Fix-it hint for `++this` -> `++*this` when deref is modifiable (PR #94159)

2024-06-10 Thread Rajveer Singh Bharadwaj via cfe-commits

https://github.com/Rajveer100 updated 
https://github.com/llvm/llvm-project/pull/94159

>From 3b25887966d1846a7c3d8f0c95fa1be73282b267 Mon Sep 17 00:00:00 2001
From: Rajveer 
Date: Sun, 2 Jun 2024 18:33:37 +0530
Subject: [PATCH] [clang] Fix-it hint for `++this` -> `++*this` when deref is
 modifiable

Resolves #93066
---
 .../clang/Basic/DiagnosticSemaKinds.td|  3 ++
 clang/lib/Sema/SemaExpr.cpp   | 23 --
 clang/test/C/drs/dr1xx.c  |  1 +
 clang/test/Sema/debug-93066.cpp   | 31 +++
 clang/test/Sema/exprs.c   |  2 ++
 clang/test/Sema/va_arg_x86_32.c   |  1 +
 clang/test/SemaObjCXX/sel-address.mm  |  8 +
 7 files changed, 67 insertions(+), 2 deletions(-)
 create mode 100644 clang/test/Sema/debug-93066.cpp

diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td 
b/clang/include/clang/Basic/DiagnosticSemaKinds.td
index 270b0a1e01307..986d454decab6 100644
--- a/clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -8777,6 +8777,9 @@ def err_typecheck_incomplete_type_not_modifiable_lvalue : 
Error<
 def err_typecheck_lvalue_casts_not_supported : Error<
   "assignment to cast is illegal, lvalue casts are not supported">;
 
+def note_typecheck_add_deref_star_not_modifiable_lvalue : Note<
+  "add '*' to dereference it">; 
+
 def err_typecheck_duplicate_vector_components_not_mlvalue : Error<
   "vector is not assignable (contains duplicate components)">;
 def err_block_decl_ref_not_modifiable_lvalue : Error<
diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp
index ff9c5ead36dcf..b585d1c0270b9 100644
--- a/clang/lib/Sema/SemaExpr.cpp
+++ b/clang/lib/Sema/SemaExpr.cpp
@@ -13273,6 +13273,22 @@ enum {
   ConstUnknown,  // Keep as last element
 };
 
+static void MaybeSuggestDerefFixIt(Sema , const Expr *E, SourceLocation Loc) 
{
+  ExprResult Deref;
+  Expr *TE = const_cast(E);
+  {
+Sema::TentativeAnalysisScope Trap(S);
+Deref = S.ActOnUnaryOp(S.getCurScope(), Loc, tok::star, TE);
+  }
+  if (Deref.isUsable() &&
+  Deref.get()->isModifiableLvalue(S.Context, ) == Expr::MLV_Valid &&
+  !E->getType()->isObjCObjectPointerType()) {
+S.Diag(Loc, diag::note_typecheck_add_deref_star_not_modifiable_lvalue)
+<< E->getSourceRange()
+<< FixItHint::CreateInsertion(E->getBeginLoc(), "*");
+  }
+}
+
 /// Emit the "read-only variable not assignable" error and print notes to give
 /// more information about why the variable is not assignable, such as pointing
 /// to the declaration of a const variable, showing that a method is const, or
@@ -13367,6 +13383,7 @@ static void DiagnoseConstAssignment(Sema , const Expr 
*E,
 if (!DiagnosticEmitted) {
   S.Diag(Loc, diag::err_typecheck_assign_const)
   << ExprRange << ConstVariable << VD << VD->getType();
+  MaybeSuggestDerefFixIt(S, E, Loc);
   DiagnosticEmitted = true;
 }
 S.Diag(VD->getLocation(), diag::note_typecheck_assign_const)
@@ -13587,10 +13604,12 @@ static bool CheckForModifiableLvalue(Expr *E, 
SourceLocation Loc, Sema ) {
   SourceRange Assign;
   if (Loc != OrigLoc)
 Assign = SourceRange(OrigLoc, OrigLoc);
-  if (NeedType)
+  if (NeedType) {
 S.Diag(Loc, DiagID) << E->getType() << E->getSourceRange() << Assign;
-  else
+  } else {
 S.Diag(Loc, DiagID) << E->getSourceRange() << Assign;
+MaybeSuggestDerefFixIt(S, E, Loc);
+  }
   return true;
 }
 
diff --git a/clang/test/C/drs/dr1xx.c b/clang/test/C/drs/dr1xx.c
index 47538e44428c3..20e953b2c20ac 100644
--- a/clang/test/C/drs/dr1xx.c
+++ b/clang/test/C/drs/dr1xx.c
@@ -296,6 +296,7 @@ void dr126(void) {
*/
   *object = 12; /* ok */
   ++object; /* expected-error {{cannot assign to variable 'object' with 
const-qualified type 'const IP' (aka 'int *const')}} */
+  /* expected-note@-1 {{add '*' to dereference it}} */
 }
 
 /* WG14 DR128: yes
diff --git a/clang/test/Sema/debug-93066.cpp b/clang/test/Sema/debug-93066.cpp
new file mode 100644
index 0..8e9c382a63bbe
--- /dev/null
+++ b/clang/test/Sema/debug-93066.cpp
@@ -0,0 +1,31 @@
+// RUN: %clang_cc1 -std=c++23 -fsyntax-only -verify %s
+
+struct S {
+  void f() {
+++this; // expected-error {{expression is not assignable}}
+// expected-note@-1 {{add '*' to dereference it}}
+  }
+
+  void g() const {
+++this; // expected-error {{expression is not assignable}}
+  }
+};
+
+void f(int* a, int* const b, const int* const c, __UINTPTR_TYPE__ d) {
+  (int*)d = 4; // expected-error {{assignment to cast is illegal, lvalue casts 
are not supported}}
+  // expected-note@-1 {{add '*' to dereference it}}
+
+  ++a;
+  ++b; // expected-error {{cannot assign to variable 'b' with const-qualified 
type 'int *const'}}
+  // expected-note@-1 {{add '*' to dereference it}}
+  // expected-note@* {{variable 'b' declared const here}}
+  ++c; // expected-error 

[clang] [clang] Fix-it hint for `++this` -> `++*this` when deref is modifiable (PR #94159)

2024-06-10 Thread Rajveer Singh Bharadwaj via cfe-commits


@@ -8777,6 +8777,9 @@ def err_typecheck_incomplete_type_not_modifiable_lvalue : 
Error<
 def err_typecheck_lvalue_casts_not_supported : Error<
   "assignment to cast is illegal, lvalue casts are not supported">;
 
+def note_typecheck_expression_not_modifiable_lvalue : Note<

Rajveer100 wrote:

Yeah, I will do that.

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


[clang] [clang] Fix-it hint for `++this` -> `++*this` when deref is modifiable (PR #94159)

2024-06-08 Thread Rajveer Singh Bharadwaj via cfe-commits

Rajveer100 wrote:

I have added a `FIXME` for now regarding the Obj-C part.

The function change is also done.

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


[clang] [clang] Fix-it hint for `++this` -> `++*this` when deref is modifiable (PR #94159)

2024-06-08 Thread Rajveer Singh Bharadwaj via cfe-commits

https://github.com/Rajveer100 updated 
https://github.com/llvm/llvm-project/pull/94159

>From 1a9ef88a6fec33521ecdfe9d7e6d5ebc8d0805a5 Mon Sep 17 00:00:00 2001
From: Rajveer 
Date: Sun, 2 Jun 2024 18:33:37 +0530
Subject: [PATCH] [clang] Fix-it hint for `++this` -> `++*this` when deref is
 modifiable

Resolves #93066
---
 .../clang/Basic/DiagnosticSemaKinds.td|  3 ++
 clang/lib/Sema/SemaExpr.cpp   | 23 --
 clang/test/C/drs/dr1xx.c  |  1 +
 clang/test/Sema/debug-93066.cpp   | 31 +++
 clang/test/Sema/exprs.c   |  2 ++
 clang/test/Sema/va_arg_x86_32.c   |  1 +
 clang/test/SemaObjCXX/sel-address.mm  |  8 +
 7 files changed, 67 insertions(+), 2 deletions(-)
 create mode 100644 clang/test/Sema/debug-93066.cpp

diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td 
b/clang/include/clang/Basic/DiagnosticSemaKinds.td
index 270b0a1e01307..0ad0a80c21521 100644
--- a/clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -8777,6 +8777,9 @@ def err_typecheck_incomplete_type_not_modifiable_lvalue : 
Error<
 def err_typecheck_lvalue_casts_not_supported : Error<
   "assignment to cast is illegal, lvalue casts are not supported">;
 
+def note_typecheck_expression_not_modifiable_lvalue : Note<
+  "add '*' to dereference it">; 
+
 def err_typecheck_duplicate_vector_components_not_mlvalue : Error<
   "vector is not assignable (contains duplicate components)">;
 def err_block_decl_ref_not_modifiable_lvalue : Error<
diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp
index ff9c5ead36dcf..cc6e29c186bd4 100644
--- a/clang/lib/Sema/SemaExpr.cpp
+++ b/clang/lib/Sema/SemaExpr.cpp
@@ -13273,6 +13273,22 @@ enum {
   ConstUnknown,  // Keep as last element
 };
 
+static void MaybeSuggestDerefFixIt(Sema , const Expr *E, SourceLocation Loc) 
{
+  ExprResult Deref;
+  Expr *TE = const_cast(E);
+  {
+Sema::TentativeAnalysisScope Trap(S);
+Deref = S.ActOnUnaryOp(S.getCurScope(), Loc, tok::star, TE);
+  }
+  if (Deref.isUsable() &&
+  Deref.get()->isModifiableLvalue(S.Context, ) == Expr::MLV_Valid &&
+  !E->getType()->isObjCObjectPointerType()) {
+S.Diag(Loc, diag::note_typecheck_expression_not_modifiable_lvalue)
+<< E->getSourceRange()
+<< FixItHint::CreateInsertion(E->getBeginLoc(), "*");
+  }
+}
+
 /// Emit the "read-only variable not assignable" error and print notes to give
 /// more information about why the variable is not assignable, such as pointing
 /// to the declaration of a const variable, showing that a method is const, or
@@ -13367,6 +13383,7 @@ static void DiagnoseConstAssignment(Sema , const Expr 
*E,
 if (!DiagnosticEmitted) {
   S.Diag(Loc, diag::err_typecheck_assign_const)
   << ExprRange << ConstVariable << VD << VD->getType();
+  MaybeSuggestDerefFixIt(S, E, Loc);
   DiagnosticEmitted = true;
 }
 S.Diag(VD->getLocation(), diag::note_typecheck_assign_const)
@@ -13587,10 +13604,12 @@ static bool CheckForModifiableLvalue(Expr *E, 
SourceLocation Loc, Sema ) {
   SourceRange Assign;
   if (Loc != OrigLoc)
 Assign = SourceRange(OrigLoc, OrigLoc);
-  if (NeedType)
+  if (NeedType) {
 S.Diag(Loc, DiagID) << E->getType() << E->getSourceRange() << Assign;
-  else
+  } else {
 S.Diag(Loc, DiagID) << E->getSourceRange() << Assign;
+MaybeSuggestDerefFixIt(S, E, Loc);
+  }
   return true;
 }
 
diff --git a/clang/test/C/drs/dr1xx.c b/clang/test/C/drs/dr1xx.c
index 47538e44428c3..20e953b2c20ac 100644
--- a/clang/test/C/drs/dr1xx.c
+++ b/clang/test/C/drs/dr1xx.c
@@ -296,6 +296,7 @@ void dr126(void) {
*/
   *object = 12; /* ok */
   ++object; /* expected-error {{cannot assign to variable 'object' with 
const-qualified type 'const IP' (aka 'int *const')}} */
+  /* expected-note@-1 {{add '*' to dereference it}} */
 }
 
 /* WG14 DR128: yes
diff --git a/clang/test/Sema/debug-93066.cpp b/clang/test/Sema/debug-93066.cpp
new file mode 100644
index 0..8e9c382a63bbe
--- /dev/null
+++ b/clang/test/Sema/debug-93066.cpp
@@ -0,0 +1,31 @@
+// RUN: %clang_cc1 -std=c++23 -fsyntax-only -verify %s
+
+struct S {
+  void f() {
+++this; // expected-error {{expression is not assignable}}
+// expected-note@-1 {{add '*' to dereference it}}
+  }
+
+  void g() const {
+++this; // expected-error {{expression is not assignable}}
+  }
+};
+
+void f(int* a, int* const b, const int* const c, __UINTPTR_TYPE__ d) {
+  (int*)d = 4; // expected-error {{assignment to cast is illegal, lvalue casts 
are not supported}}
+  // expected-note@-1 {{add '*' to dereference it}}
+
+  ++a;
+  ++b; // expected-error {{cannot assign to variable 'b' with const-qualified 
type 'int *const'}}
+  // expected-note@-1 {{add '*' to dereference it}}
+  // expected-note@* {{variable 'b' declared const here}}
+  ++c; // expected-error {{cannot assign 

[clang] Fixed grammatical error in "enum specifier" error msg #94443 (PR #94592)

2024-06-07 Thread Rajveer Singh Bharadwaj via cfe-commits

Rajveer100 wrote:

I think this can be merged considering the approved changes?

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


[clang] [clang] Fix-it hint for `++this` -> `++*this` when deref is modifiable (PR #94159)

2024-06-07 Thread Rajveer Singh Bharadwaj via cfe-commits


@@ -10,6 +10,7 @@ void h() {
   SEL* ps = 
 
   @selector(dealloc) = s;  // expected-error {{expression is not assignable}}
+  // expected-note@-1 {{add '*' to dereference it}}

Rajveer100 wrote:

I see a way to handle this:

`E->getType()->isSpecificBuiltinType(clang::BuiltinType::ObjCSel)` 

Unfortunately doesn't work, since from what I understand, we could be checking 
for a compound expression here for `E`.

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


[clang] [clang] Fix-it hint for `++this` -> `++*this` when deref is modifiable (PR #94159)

2024-06-07 Thread Rajveer Singh Bharadwaj via cfe-commits


@@ -13367,6 +13367,21 @@ static void DiagnoseConstAssignment(Sema , const 
Expr *E,
 if (!DiagnosticEmitted) {
   S.Diag(Loc, diag::err_typecheck_assign_const)
   << ExprRange << ConstVariable << VD << VD->getType();
+  ExprResult Deref;
+  Expr *TE = const_cast(E);

Rajveer100 wrote:

I think it would be more prone to modifications due to it being non `const` and 
being used in many other contexts, maybe we could leave it as it is for now?

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


[clang] [clang] Fix-it hint for `++this` -> `++*this` when deref is modifiable (PR #94159)

2024-06-07 Thread Rajveer Singh Bharadwaj via cfe-commits


@@ -13367,6 +13367,20 @@ static void DiagnoseConstAssignment(Sema , const 
Expr *E,
 if (!DiagnosticEmitted) {
   S.Diag(Loc, diag::err_typecheck_assign_const)
   << ExprRange << ConstVariable << VD << VD->getType();
+  ExprResult Deref;
+  Expr *TE = const_cast(E);
+  {
+Sema::TentativeAnalysisScope Trap(S);
+Deref = S.ActOnUnaryOp(S.getCurScope(), Loc, tok::star, TE);
+  }
+  if (Deref.isUsable() &&
+  Deref.get()->isModifiableLvalue(S.Context, ) ==
+  Expr::MLV_Valid &&
+  !E->getType()->isObjCObjectPointerType()) {
+S.Diag(Loc, diag::note_typecheck_expression_not_modifiable_lvalue)
+<< E->getSourceRange()
+<< FixItHint::CreateInsertion(E->getBeginLoc(), "*");
+  }

Rajveer100 wrote:

Yeah, I was thinking about this earlier, will do it considering the differences.

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


[clang] [clang] Fix-it hint for `++this` -> `++*this` when deref is modifiable (PR #94159)

2024-06-07 Thread Rajveer Singh Bharadwaj via cfe-commits


@@ -10,6 +10,7 @@ void h() {
   SEL* ps = 
 
   @selector(dealloc) = s;  // expected-error {{expression is not assignable}}
+  // expected-note@-1 {{add '*' to dereference it}}

Rajveer100 wrote:

Actually, it isn't valid in case of `@selector`, that's why I was thinking of 
potential solutions. 

Like one of the tests got ignored using 
`!E->getType()->isObjCObjectPointerType()`, similarly clang would have for 
selectors as well.


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


[clang] [clang] Fix-it hint for `++this` -> `++*this` when deref is modifiable (PR #94159)

2024-06-07 Thread Rajveer Singh Bharadwaj via cfe-commits


@@ -10,6 +10,7 @@ void h() {
   SEL* ps = 
 
   @selector(dealloc) = s;  // expected-error {{expression is not assignable}}
+  // expected-note@-1 {{add '*' to dereference it}}

Rajveer100 wrote:

One way I can think of is to do a AST visit and check for `ObjCSelectorExpr` in 
the child nodes of the `ValueDecl`.

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


[clang] [clang] Fix-it hint for `++this` -> `++*this` when deref is modifiable (PR #94159)

2024-06-07 Thread Rajveer Singh Bharadwaj via cfe-commits

https://github.com/Rajveer100 updated 
https://github.com/llvm/llvm-project/pull/94159

>From e38b38773bcade3407dde112994de5a6c5f0d7e0 Mon Sep 17 00:00:00 2001
From: Rajveer 
Date: Sun, 2 Jun 2024 18:33:37 +0530
Subject: [PATCH] [clang] Fix-it hint for `++this` -> `++*this` when deref is
 modifiable

Resolves #93066
---
 .../clang/Basic/DiagnosticSemaKinds.td|  3 ++
 clang/lib/Sema/SemaExpr.cpp   | 30 --
 clang/test/C/drs/dr1xx.c  |  1 +
 clang/test/Sema/debug-93066.cpp   | 31 +++
 clang/test/Sema/exprs.c   |  2 ++
 clang/test/Sema/va_arg_x86_32.c   |  1 +
 clang/test/SemaObjCXX/sel-address.mm  |  1 +
 7 files changed, 67 insertions(+), 2 deletions(-)
 create mode 100644 clang/test/Sema/debug-93066.cpp

diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td 
b/clang/include/clang/Basic/DiagnosticSemaKinds.td
index 270b0a1e01307..0ad0a80c21521 100644
--- a/clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -8777,6 +8777,9 @@ def err_typecheck_incomplete_type_not_modifiable_lvalue : 
Error<
 def err_typecheck_lvalue_casts_not_supported : Error<
   "assignment to cast is illegal, lvalue casts are not supported">;
 
+def note_typecheck_expression_not_modifiable_lvalue : Note<
+  "add '*' to dereference it">; 
+
 def err_typecheck_duplicate_vector_components_not_mlvalue : Error<
   "vector is not assignable (contains duplicate components)">;
 def err_block_decl_ref_not_modifiable_lvalue : Error<
diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp
index ff9c5ead36dcf..4c1dc9313947b 100644
--- a/clang/lib/Sema/SemaExpr.cpp
+++ b/clang/lib/Sema/SemaExpr.cpp
@@ -13367,6 +13367,20 @@ static void DiagnoseConstAssignment(Sema , const 
Expr *E,
 if (!DiagnosticEmitted) {
   S.Diag(Loc, diag::err_typecheck_assign_const)
   << ExprRange << ConstVariable << VD << VD->getType();
+  ExprResult Deref;
+  Expr *TE = const_cast(E);
+  {
+Sema::TentativeAnalysisScope Trap(S);
+Deref = S.ActOnUnaryOp(S.getCurScope(), Loc, tok::star, TE);
+  }
+  if (Deref.isUsable() &&
+  Deref.get()->isModifiableLvalue(S.Context, ) ==
+  Expr::MLV_Valid &&
+  !E->getType()->isObjCObjectPointerType()) {
+S.Diag(Loc, diag::note_typecheck_expression_not_modifiable_lvalue)
+<< E->getSourceRange()
+<< FixItHint::CreateInsertion(E->getBeginLoc(), "*");
+  }
   DiagnosticEmitted = true;
 }
 S.Diag(VD->getLocation(), diag::note_typecheck_assign_const)
@@ -13587,10 +13601,22 @@ static bool CheckForModifiableLvalue(Expr *E, 
SourceLocation Loc, Sema ) {
   SourceRange Assign;
   if (Loc != OrigLoc)
 Assign = SourceRange(OrigLoc, OrigLoc);
-  if (NeedType)
+  if (NeedType) {
 S.Diag(Loc, DiagID) << E->getType() << E->getSourceRange() << Assign;
-  else
+  } else {
+ExprResult Deref;
+{
+  Sema::TentativeAnalysisScope Trap(S);
+  Deref = S.ActOnUnaryOp(S.getCurScope(), Loc, tok::star, E);
+}
 S.Diag(Loc, DiagID) << E->getSourceRange() << Assign;
+if (Deref.isUsable() &&
+Deref.get()->isModifiableLvalue(S.Context, ) == Expr::MLV_Valid) {
+  S.Diag(Loc, diag::note_typecheck_expression_not_modifiable_lvalue)
+  << E->getSourceRange() << Assign
+  << FixItHint::CreateInsertion(E->getBeginLoc(), "*");
+}
+  }
   return true;
 }
 
diff --git a/clang/test/C/drs/dr1xx.c b/clang/test/C/drs/dr1xx.c
index 47538e44428c3..20e953b2c20ac 100644
--- a/clang/test/C/drs/dr1xx.c
+++ b/clang/test/C/drs/dr1xx.c
@@ -296,6 +296,7 @@ void dr126(void) {
*/
   *object = 12; /* ok */
   ++object; /* expected-error {{cannot assign to variable 'object' with 
const-qualified type 'const IP' (aka 'int *const')}} */
+  /* expected-note@-1 {{add '*' to dereference it}} */
 }
 
 /* WG14 DR128: yes
diff --git a/clang/test/Sema/debug-93066.cpp b/clang/test/Sema/debug-93066.cpp
new file mode 100644
index 0..8e9c382a63bbe
--- /dev/null
+++ b/clang/test/Sema/debug-93066.cpp
@@ -0,0 +1,31 @@
+// RUN: %clang_cc1 -std=c++23 -fsyntax-only -verify %s
+
+struct S {
+  void f() {
+++this; // expected-error {{expression is not assignable}}
+// expected-note@-1 {{add '*' to dereference it}}
+  }
+
+  void g() const {
+++this; // expected-error {{expression is not assignable}}
+  }
+};
+
+void f(int* a, int* const b, const int* const c, __UINTPTR_TYPE__ d) {
+  (int*)d = 4; // expected-error {{assignment to cast is illegal, lvalue casts 
are not supported}}
+  // expected-note@-1 {{add '*' to dereference it}}
+
+  ++a;
+  ++b; // expected-error {{cannot assign to variable 'b' with const-qualified 
type 'int *const'}}
+  // expected-note@-1 {{add '*' to dereference it}}
+  // expected-note@* 

[clang] [clang] Fix-it hint for `++this` -> `++*this` when deref is modifiable (PR #94159)

2024-06-07 Thread Rajveer Singh Bharadwaj via cfe-commits

https://github.com/Rajveer100 edited 
https://github.com/llvm/llvm-project/pull/94159
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [clang] Fix-it hint for `++this` -> `++*this` when deref is modifiable (PR #94159)

2024-06-06 Thread Rajveer Singh Bharadwaj via cfe-commits


@@ -10,6 +10,7 @@ void h() {
   SEL* ps = 
 
   @selector(dealloc) = s;  // expected-error {{expression is not assignable}}
+  // expected-note@-1 {{add '*' to dereference it}}

Rajveer100 wrote:

I made a check for `isObjCObjectPointerType`, maybe there's a separate one for 
`@selector` as well?

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


[clang] [clang] Fix-it hint for `++this` -> `++*this` when deref is modifiable (PR #94159)

2024-06-06 Thread Rajveer Singh Bharadwaj via cfe-commits

https://github.com/Rajveer100 edited 
https://github.com/llvm/llvm-project/pull/94159
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [clang] Fix-it hint for `++this` -> `++*this` when deref is modifiable (PR #94159)

2024-06-06 Thread Rajveer Singh Bharadwaj via cfe-commits


@@ -10,6 +10,7 @@ void h() {
   SEL* ps = 
 
   @selector(dealloc) = s;  // expected-error {{expression is not assignable}}
+  // expected-note@-1 {{add '*' to dereference it}}

Rajveer100 wrote:

>From my knowledge, this would assign the value of s to the SEL object pointed 
>to by @selector(dealloc). However, in Objective-C, selectors are not pointers, 
>they are special compile-time constructs representing method names, and they 
>are immutable, so you cannot assign values to them. 

Therefore, this syntax is not valid for selectors in Objective-C.

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


[clang] [clang] Fix-it hint for `++this` -> `++*this` when deref is modifiable (PR #94159)

2024-06-06 Thread Rajveer Singh Bharadwaj via cfe-commits


@@ -13367,6 +13367,21 @@ static void DiagnoseConstAssignment(Sema , const 
Expr *E,
 if (!DiagnosticEmitted) {
   S.Diag(Loc, diag::err_typecheck_assign_const)
   << ExprRange << ConstVariable << VD << VD->getType();
+  ExprResult Deref;
+  Expr *TE = const_cast(E);
+  {
+Sema::TentativeAnalysisScope Trap(S);
+Deref = S.ActOnUnaryOp(S.getCurScope(), Loc, tok::star, TE);
+  }
+  if (Deref.isUsable() &&
+  Deref.get()->isModifiableLvalue(S.Context, ) ==
+  Expr::MLV_Valid &&
+  !E->getType()->isObjCObjectPointerType()) {
+S.Diag(Loc, diag::note_typecheck_expression_not_modifiable_lvalue)
+<< E->getSourceRange()
+<< FixItHint::CreateInsertion(E->getBeginLoc(),
+  "*" + VD->getNameAsString());

Rajveer100 wrote:

Hmm, yes.

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


[clang] [clang] Fix-it hint for `++this` -> `++*this` when deref is modifiable (PR #94159)

2024-06-06 Thread Rajveer Singh Bharadwaj via cfe-commits


@@ -13587,10 +13602,47 @@ static bool CheckForModifiableLvalue(Expr *E, 
SourceLocation Loc, Sema ) {
   SourceRange Assign;
   if (Loc != OrigLoc)
 Assign = SourceRange(OrigLoc, OrigLoc);
-  if (NeedType)
+  if (NeedType) {
 S.Diag(Loc, DiagID) << E->getType() << E->getSourceRange() << Assign;
-  else
+  } else {
+ExprResult Deref;
+{
+  Sema::TentativeAnalysisScope Trap(S);
+  Deref = S.ActOnUnaryOp(S.getCurScope(), Loc, tok::star, E);
+}
 S.Diag(Loc, DiagID) << E->getSourceRange() << Assign;
+if (Deref.isUsable() &&
+Deref.get()->isModifiableLvalue(S.Context, ) == Expr::MLV_Valid) {
+  std::string exprType;
+  switch (E->getStmtClass()) {
+  case Stmt::CStyleCastExprClass: {
+const auto *CSC = cast(E);
+exprType = CSC->getType().getAsString();
+break;
+  }
+  case Stmt::CXXConstCastExprClass: {
+const auto *CXXCCE = cast(E);
+exprType = CXXCCE->getTypeAsWritten().getAsString();
+break;
+  }
+  case Stmt::CXXReinterpretCastExprClass: {
+const auto *CXXRCE = cast(E);
+exprType = CXXRCE->getTypeAsWritten().getAsString();
+break;
+  }
+  case Stmt::CXXThisExprClass: {
+exprType = "this";
+break;
+  }
+  default: {
+  }
+  }
+  S.Diag(Loc, diag::note_typecheck_expression_not_modifiable_lvalue)
+  << E->getSourceRange() << Assign
+  << FixItHint::CreateInsertion(E->getBeginLoc(),
+"*(" + exprType + ")");
+}

Rajveer100 wrote:

Ahh, I thought of making it more descriptive (like Rust), you want me to remove 
this and just suggest `*(...)`?

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


[clang] [clang] Fix-it hint for `++this` -> `++*this` when deref is modifiable (PR #94159)

2024-06-06 Thread Rajveer Singh Bharadwaj via cfe-commits

https://github.com/Rajveer100 edited 
https://github.com/llvm/llvm-project/pull/94159
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [clang] Fix-it hint for `++this` -> `++*this` when deref is modifiable (PR #94159)

2024-06-06 Thread Rajveer Singh Bharadwaj via cfe-commits


@@ -13367,6 +13367,21 @@ static void DiagnoseConstAssignment(Sema , const 
Expr *E,
 if (!DiagnosticEmitted) {
   S.Diag(Loc, diag::err_typecheck_assign_const)
   << ExprRange << ConstVariable << VD << VD->getType();
+  ExprResult Deref;
+  Expr *TE = const_cast(E);
+  {
+Sema::TentativeAnalysisScope Trap(S);
+Deref = S.ActOnUnaryOp(S.getCurScope(), Loc, tok::star, TE);
+  }
+  if (Deref.isUsable() &&
+  Deref.get()->isModifiableLvalue(S.Context, ) ==
+  Expr::MLV_Valid &&
+  !E->getType()->isObjCObjectPointerType()) {
+S.Diag(Loc, diag::note_typecheck_expression_not_modifiable_lvalue)
+<< E->getSourceRange()
+<< FixItHint::CreateInsertion(E->getBeginLoc(),
+  "*" + VD->getNameAsString());

Rajveer100 wrote:

This is what it currently looks like:

Details


```C++
clang/test/Sema/debug-93066.cpp:5:5: error: expression is not assignable
5 | ++this; // expected-error {{expression is not assignable}}
  | ^ 
clang/test/Sema/debug-93066.cpp:5:5: note: add '*' to dereference it
5 | ++this; // expected-error {{expression is not assignable}}
  | ^ 
  |   *(this)
clang/test/Sema/debug-93066.cpp:10:5: error: expression is not assignable
   10 | ++this; // expected-error {{expression is not assignable}}
  | ^ 
clang/test/Sema/debug-93066.cpp:15:3: error: assignment to cast is illegal, 
lvalue casts are not supported
   15 |   (int*)d = 4; // expected-error {{assignment to cast is illegal, 
lvalue casts are not supported}}
  |   ^~~ ~
clang/test/Sema/debug-93066.cpp:15:3: note: add '*' to dereference it
   15 |   (int*)d = 4; // expected-error {{assignment to cast is illegal, 
lvalue casts are not supported}}
  |   ^~~ ~
  |   *(int *)
clang/test/Sema/debug-93066.cpp:19:3: error: cannot assign to variable 'b' with 
const-qualified type 'int *const'
   19 |   ++b; // expected-error {{cannot assign to variable 'b' with 
const-qualified type 'int *const'}}
  |   ^ ~
clang/test/Sema/debug-93066.cpp:19:3: note: add '*' to dereference it
   19 |   ++b; // expected-error {{cannot assign to variable 'b' with 
const-qualified type 'int *const'}}
  |   ^ ~
  | *b
clang/test/Sema/debug-93066.cpp:14:27: note: variable 'b' declared const here
   14 | void f(int* a, int* const b, const int* const c, __UINTPTR_TYPE__ d) {
  |~~~^
clang/test/Sema/debug-93066.cpp:22:3: error: cannot assign to variable 'c' with 
const-qualified type 'const int *const'
   22 |   ++c; // expected-error {{cannot assign to variable 'c' with 
const-qualified type 'const int *const'}}
  |   ^ ~
clang/test/Sema/debug-93066.cpp:14:47: note: variable 'c' declared const here
   14 | void f(int* a, int* const b, const int* const c, __UINTPTR_TYPE__ d) {
  |  ~^
clang/test/Sema/debug-93066.cpp:25:30: error: expression is not assignable
   25 |   reinterpret_cast(42) += 3; // expected-error {{expression is 
not assignable}}
  |   ~~ ^
clang/test/Sema/debug-93066.cpp:25:30: note: add '*' to dereference it
   25 |   reinterpret_cast(42) += 3; // expected-error {{expression is 
not assignable}}
  |   ~~ ^
  |   *(int *)
clang/test/Sema/debug-93066.cpp:29:26: error: expression is not assignable
   29 |   (const_cast()) += 3; // expected-error {{expression is not 
assignable}}
  |   ~~ ^
clang/test/Sema/debug-93066.cpp:29:26: note: add '*' to dereference it
   29 |   (const_cast()) += 3; // expected-error {{expression is not 
assignable}}
  |   ~~ ^
  |   *()

```


 

Maybe we could FixItReplace instead?

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


[clang] [clang] Fix-it hint for `++this` -> `++*this` when deref is modifiable (PR #94159)

2024-06-06 Thread Rajveer Singh Bharadwaj via cfe-commits

Rajveer100 wrote:

@Sirraide 
Let me know if any further changes are needed. All tests should pass once CI 
finishes.

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


[clang] [clang] Fix-it hint for `++this` -> `++*this` when deref is modifiable (PR #94159)

2024-06-06 Thread Rajveer Singh Bharadwaj via cfe-commits

https://github.com/Rajveer100 updated 
https://github.com/llvm/llvm-project/pull/94159

>From 5092ffd04d1eeefcd0e9708415d40886e112bc31 Mon Sep 17 00:00:00 2001
From: Rajveer 
Date: Sun, 2 Jun 2024 18:33:37 +0530
Subject: [PATCH] [clang] Fix-it hint for `++this` -> `++*this` when deref is
 modifiable

Resolves #93066
---
 .../clang/Basic/DiagnosticSemaKinds.td|  3 +
 clang/lib/Sema/SemaExpr.cpp   | 56 ++-
 clang/test/C/drs/dr1xx.c  |  1 +
 clang/test/Sema/debug-93066.cpp   | 31 ++
 clang/test/Sema/exprs.c   |  2 +
 clang/test/Sema/va_arg_x86_32.c   |  1 +
 clang/test/SemaObjCXX/sel-address.mm  |  1 +
 7 files changed, 93 insertions(+), 2 deletions(-)
 create mode 100644 clang/test/Sema/debug-93066.cpp

diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td 
b/clang/include/clang/Basic/DiagnosticSemaKinds.td
index 270b0a1e01307..0ad0a80c21521 100644
--- a/clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -8777,6 +8777,9 @@ def err_typecheck_incomplete_type_not_modifiable_lvalue : 
Error<
 def err_typecheck_lvalue_casts_not_supported : Error<
   "assignment to cast is illegal, lvalue casts are not supported">;
 
+def note_typecheck_expression_not_modifiable_lvalue : Note<
+  "add '*' to dereference it">; 
+
 def err_typecheck_duplicate_vector_components_not_mlvalue : Error<
   "vector is not assignable (contains duplicate components)">;
 def err_block_decl_ref_not_modifiable_lvalue : Error<
diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp
index ff9c5ead36dcf..125aaf8981358 100644
--- a/clang/lib/Sema/SemaExpr.cpp
+++ b/clang/lib/Sema/SemaExpr.cpp
@@ -13367,6 +13367,21 @@ static void DiagnoseConstAssignment(Sema , const 
Expr *E,
 if (!DiagnosticEmitted) {
   S.Diag(Loc, diag::err_typecheck_assign_const)
   << ExprRange << ConstVariable << VD << VD->getType();
+  ExprResult Deref;
+  Expr *TE = const_cast(E);
+  {
+Sema::TentativeAnalysisScope Trap(S);
+Deref = S.ActOnUnaryOp(S.getCurScope(), Loc, tok::star, TE);
+  }
+  if (Deref.isUsable() &&
+  Deref.get()->isModifiableLvalue(S.Context, ) ==
+  Expr::MLV_Valid &&
+  !E->getType()->isObjCObjectPointerType()) {
+S.Diag(Loc, diag::note_typecheck_expression_not_modifiable_lvalue)
+<< E->getSourceRange()
+<< FixItHint::CreateInsertion(E->getBeginLoc(),
+  "*" + VD->getNameAsString());
+  }
   DiagnosticEmitted = true;
 }
 S.Diag(VD->getLocation(), diag::note_typecheck_assign_const)
@@ -13587,10 +13602,47 @@ static bool CheckForModifiableLvalue(Expr *E, 
SourceLocation Loc, Sema ) {
   SourceRange Assign;
   if (Loc != OrigLoc)
 Assign = SourceRange(OrigLoc, OrigLoc);
-  if (NeedType)
+  if (NeedType) {
 S.Diag(Loc, DiagID) << E->getType() << E->getSourceRange() << Assign;
-  else
+  } else {
+ExprResult Deref;
+{
+  Sema::TentativeAnalysisScope Trap(S);
+  Deref = S.ActOnUnaryOp(S.getCurScope(), Loc, tok::star, E);
+}
 S.Diag(Loc, DiagID) << E->getSourceRange() << Assign;
+if (Deref.isUsable() &&
+Deref.get()->isModifiableLvalue(S.Context, ) == Expr::MLV_Valid) {
+  std::string exprType;
+  switch (E->getStmtClass()) {
+  case Stmt::CStyleCastExprClass: {
+const auto *CSC = cast(E);
+exprType = CSC->getType().getAsString();
+break;
+  }
+  case Stmt::CXXConstCastExprClass: {
+const auto *CXXCCE = cast(E);
+exprType = CXXCCE->getTypeAsWritten().getAsString();
+break;
+  }
+  case Stmt::CXXReinterpretCastExprClass: {
+const auto *CXXRCE = cast(E);
+exprType = CXXRCE->getTypeAsWritten().getAsString();
+break;
+  }
+  case Stmt::CXXThisExprClass: {
+exprType = "this";
+break;
+  }
+  default: {
+  }
+  }
+  S.Diag(Loc, diag::note_typecheck_expression_not_modifiable_lvalue)
+  << E->getSourceRange() << Assign
+  << FixItHint::CreateInsertion(E->getBeginLoc(),
+"*(" + exprType + ")");
+}
+  }
   return true;
 }
 
diff --git a/clang/test/C/drs/dr1xx.c b/clang/test/C/drs/dr1xx.c
index 47538e44428c3..20e953b2c20ac 100644
--- a/clang/test/C/drs/dr1xx.c
+++ b/clang/test/C/drs/dr1xx.c
@@ -296,6 +296,7 @@ void dr126(void) {
*/
   *object = 12; /* ok */
   ++object; /* expected-error {{cannot assign to variable 'object' with 
const-qualified type 'const IP' (aka 'int *const')}} */
+  /* expected-note@-1 {{add '*' to dereference it}} */
 }
 
 /* WG14 DR128: yes
diff --git a/clang/test/Sema/debug-93066.cpp b/clang/test/Sema/debug-93066.cpp
new file mode 100644
index 

[clang] [clang] Fix-it hint for `++this` -> `++*this` when deref is modifiable (PR #94159)

2024-06-05 Thread Rajveer Singh Bharadwaj via cfe-commits


@@ -13367,6 +13367,8 @@ static void DiagnoseConstAssignment(Sema , const Expr 
*E,
 if (!DiagnosticEmitted) {
   S.Diag(Loc, diag::err_typecheck_assign_const)
   << ExprRange << ConstVariable << VD << VD->getType();
+  S.Diag(Loc, diag::note_typecheck_expression_not_modifiable_lvalue)
+  << E->getSourceRange();

Rajveer100 wrote:

Well, for cases such as these:

```C++
void dr108(void) {
#define const
  const int i = 12;
#undef const
  const int j = 12; /* expected-note {{variable 'j' declared const here}} */

  i = 100; /* Okay, the keyword was hidden by the macro. */
  j = 100; /* expected-error {{cannot assign to variable 'j' with 
const-qualified type 'const int'}} */
  ^
}
```

It doesn't make sense right.

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


[clang] [clang] Fix-it hint for `++this` -> `++*this` when deref is modifiable (PR #94159)

2024-06-04 Thread Rajveer Singh Bharadwaj via cfe-commits


@@ -13367,6 +13367,8 @@ static void DiagnoseConstAssignment(Sema , const Expr 
*E,
 if (!DiagnosticEmitted) {
   S.Diag(Loc, diag::err_typecheck_assign_const)
   << ExprRange << ConstVariable << VD << VD->getType();
+  S.Diag(Loc, diag::note_typecheck_expression_not_modifiable_lvalue)
+  << E->getSourceRange();

Rajveer100 wrote:

@Sirraide 
This addition caused few more tests to fail. It's for the `++b` part in tests 
(maybe there's a different way to go about this), apart from that, looks fine 
to me. Let me know your thoughts.

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


[clang] [clang] Fix-it hint for `++this` -> `++*this` when deref is modifiable (PR #94159)

2024-06-04 Thread Rajveer Singh Bharadwaj via cfe-commits

https://github.com/Rajveer100 updated 
https://github.com/llvm/llvm-project/pull/94159

>From 6dec67c1fe9b64881a7b4f97f2341b2fdf7db48b Mon Sep 17 00:00:00 2001
From: Rajveer 
Date: Sun, 2 Jun 2024 18:33:37 +0530
Subject: [PATCH] [clang] Fix-it hint for `++this` -> `++*this` when deref is
 modifiable

Resolves #93066
---
 .../clang/Basic/DiagnosticSemaKinds.td|  3 ++
 clang/lib/Sema/SemaExpr.cpp   | 18 ++--
 clang/test/Sema/debug-93066.cpp   | 28 +++
 clang/test/Sema/exprs.c   |  2 ++
 clang/test/Sema/va_arg_x86_32.c   |  1 +
 clang/test/SemaObjCXX/sel-address.mm  |  1 +
 6 files changed, 51 insertions(+), 2 deletions(-)
 create mode 100644 clang/test/Sema/debug-93066.cpp

diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td 
b/clang/include/clang/Basic/DiagnosticSemaKinds.td
index 270b0a1e01307..0ad0a80c21521 100644
--- a/clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -8777,6 +8777,9 @@ def err_typecheck_incomplete_type_not_modifiable_lvalue : 
Error<
 def err_typecheck_lvalue_casts_not_supported : Error<
   "assignment to cast is illegal, lvalue casts are not supported">;
 
+def note_typecheck_expression_not_modifiable_lvalue : Note<
+  "add '*' to dereference it">; 
+
 def err_typecheck_duplicate_vector_components_not_mlvalue : Error<
   "vector is not assignable (contains duplicate components)">;
 def err_block_decl_ref_not_modifiable_lvalue : Error<
diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp
index ff9c5ead36dcf..62da33e64bf7b 100644
--- a/clang/lib/Sema/SemaExpr.cpp
+++ b/clang/lib/Sema/SemaExpr.cpp
@@ -13367,6 +13367,8 @@ static void DiagnoseConstAssignment(Sema , const Expr 
*E,
 if (!DiagnosticEmitted) {
   S.Diag(Loc, diag::err_typecheck_assign_const)
   << ExprRange << ConstVariable << VD << VD->getType();
+  S.Diag(Loc, diag::note_typecheck_expression_not_modifiable_lvalue)
+  << E->getSourceRange();
   DiagnosticEmitted = true;
 }
 S.Diag(VD->getLocation(), diag::note_typecheck_assign_const)
@@ -13587,10 +13589,22 @@ static bool CheckForModifiableLvalue(Expr *E, 
SourceLocation Loc, Sema ) {
   SourceRange Assign;
   if (Loc != OrigLoc)
 Assign = SourceRange(OrigLoc, OrigLoc);
-  if (NeedType)
+  if (NeedType) {
 S.Diag(Loc, DiagID) << E->getType() << E->getSourceRange() << Assign;
-  else
+  } else {
+ExprResult Deref;
+{
+  Sema::TentativeAnalysisScope Trap(S);
+  Deref = S.ActOnUnaryOp(S.getCurScope(), Loc, tok::star, E);
+}
 S.Diag(Loc, DiagID) << E->getSourceRange() << Assign;
+if (Deref.isUsable() &&
+Deref.get()->isModifiableLvalue(S.Context, ) == Expr::MLV_Valid) {
+  S.Diag(Loc, diag::note_typecheck_expression_not_modifiable_lvalue)
+  << E->getSourceRange() << Assign;
+  FixItHint::CreateInsertion(E->getBeginLoc(), "++*this");
+}
+  }
   return true;
 }
 
diff --git a/clang/test/Sema/debug-93066.cpp b/clang/test/Sema/debug-93066.cpp
new file mode 100644
index 0..e0bd87fb810ef
--- /dev/null
+++ b/clang/test/Sema/debug-93066.cpp
@@ -0,0 +1,28 @@
+// RUN: %clang_cc1 -std=c++23 -fsyntax-only -verify %s
+
+struct S {
+  void f() {
+++this; // expected-error {{expression is not assignable}}
+// expected-note@-1 {{add '*' to dereference it}}
+  }
+
+  void g() const {
+++this; // expected-error {{expression is not assignable}}
+  }
+};
+
+void f(int* a, int* const b, const int* const c, __UINTPTR_TYPE__ d) {
+  (int*)d = 4; // expected-error {{assignment to cast is illegal, lvalue casts 
are not supported}}
+  // expected-note@-1 {{add '*' to dereference it}}
+
+  ++a;
+  ++b; // expected-error {{cannot assign to variable 'b' with const-qualified 
type 'int *const'}}
+  // expected-note@-1 {{add '*' to dereference it}}
+  // expected-note@* {{variable 'b' declared const here}}
+  ++c; // expected-error {{cannot assign to variable 'c' with const-qualified 
type 'const int *const'}}
+  // expected-note@-1 {{add '*' to dereference it}}
+  // expected-note@* {{variable 'c' declared const here}}
+
+  reinterpret_cast(42) += 3; // expected-error {{expression is not 
assignable}}
+  // expected-note@-1 {{add '*' to dereference it}}
+}
diff --git a/clang/test/Sema/exprs.c b/clang/test/Sema/exprs.c
index 3203d961dd0a4..a5b7268f4f527 100644
--- a/clang/test/Sema/exprs.c
+++ b/clang/test/Sema/exprs.c
@@ -65,8 +65,10 @@ void test4(void) {
 
 void test5(int *X, float *P) {
   (float*)X = P;   // expected-error {{assignment to cast is illegal, lvalue 
casts are not supported}}
+  // expected-note@-1 {{add '*' to dereference it}}
 #define FOO ((float*) X)
   FOO = P;   // expected-error {{assignment to cast is illegal, lvalue casts 
are not supported}}
+  // expected-note@-1 {{add '*' to dereference it}}
 }
 
 void test6(void) {
diff --git 

[clang] [clang] Fix-it hint for `++this` -> `++*this` when deref is modifiable (PR #94159)

2024-06-04 Thread Rajveer Singh Bharadwaj via cfe-commits

https://github.com/Rajveer100 edited 
https://github.com/llvm/llvm-project/pull/94159
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [clang] Fix-it hint for `++this` -> `++*this` when deref is modifiable (PR #94159)

2024-06-04 Thread Rajveer Singh Bharadwaj via cfe-commits


@@ -0,0 +1,14 @@
+// RUN: %clang_cc1 -std=c++23 -fsyntax-only -verify %s
+

Rajveer100 wrote:

Sure, I'll add more.

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


[clang] [clang] Fix-it hint for `++this` -> `++*this` when deref is modifiable (PR #94159)

2024-06-03 Thread Rajveer Singh Bharadwaj via cfe-commits

Rajveer100 wrote:

Tests which fail currently:

Clang :: Sema/exprs.c
Clang :: Sema/va_arg_x86_32.c
Clang :: SemaObjCXX/sel-address.mm

Also, what do you think about the fix-it hint wording for errors such as 
`assignment to cast is illegal, lvalue casts are not supported`?

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


[clang] [clang] Fix-it hint for `++this` -> `++*this` when deref is modifiable (PR #94159)

2024-06-02 Thread Rajveer Singh Bharadwaj via cfe-commits

https://github.com/Rajveer100 updated 
https://github.com/llvm/llvm-project/pull/94159

>From 95ce40b0336cda8c5a352d8abb824906b1d643d9 Mon Sep 17 00:00:00 2001
From: Rajveer 
Date: Sun, 2 Jun 2024 18:33:37 +0530
Subject: [PATCH] [clang] Fix-it hint for `++this` -> `++*this` when deref is
 modifiable

Resolves #93066
---
 clang/include/clang/Basic/DiagnosticSemaKinds.td |  3 +++
 clang/lib/Sema/SemaExpr.cpp  | 16 ++--
 clang/test/Sema/debug-93066.cpp  | 14 ++
 3 files changed, 31 insertions(+), 2 deletions(-)
 create mode 100644 clang/test/Sema/debug-93066.cpp

diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td 
b/clang/include/clang/Basic/DiagnosticSemaKinds.td
index 270b0a1e01307..0f5445296e45f 100644
--- a/clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -8777,6 +8777,9 @@ def err_typecheck_incomplete_type_not_modifiable_lvalue : 
Error<
 def err_typecheck_lvalue_casts_not_supported : Error<
   "assignment to cast is illegal, lvalue casts are not supported">;
 
+def note_typecheck_expression_not_modifiable_lvalue : Note<
+  "dereference the pointer to modify">; 
+
 def err_typecheck_duplicate_vector_components_not_mlvalue : Error<
   "vector is not assignable (contains duplicate components)">;
 def err_block_decl_ref_not_modifiable_lvalue : Error<
diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp
index ff9c5ead36dcf..62cbc8a3a6a45 100644
--- a/clang/lib/Sema/SemaExpr.cpp
+++ b/clang/lib/Sema/SemaExpr.cpp
@@ -13587,10 +13587,22 @@ static bool CheckForModifiableLvalue(Expr *E, 
SourceLocation Loc, Sema ) {
   SourceRange Assign;
   if (Loc != OrigLoc)
 Assign = SourceRange(OrigLoc, OrigLoc);
-  if (NeedType)
+  if (NeedType) {
 S.Diag(Loc, DiagID) << E->getType() << E->getSourceRange() << Assign;
-  else
+  } else {
+ExprResult Deref;
+unsigned FixitDiagID = 0;
+{
+  Sema::TentativeAnalysisScope Trap(S);
+  Deref = S.ActOnUnaryOp(S.getCurScope(), Loc, tok::star, E);
+}
 S.Diag(Loc, DiagID) << E->getSourceRange() << Assign;
+if (Deref.isUsable() &&
+Deref.get()->isModifiableLvalue(S.Context, ) == Expr::MLV_Valid) {
+  FixitDiagID = diag::note_typecheck_expression_not_modifiable_lvalue;
+  S.Diag(Loc, FixitDiagID) << E->getSourceRange() << Assign;
+}
+  }
   return true;
 }
 
diff --git a/clang/test/Sema/debug-93066.cpp b/clang/test/Sema/debug-93066.cpp
new file mode 100644
index 0..7abedcd0d4d80
--- /dev/null
+++ b/clang/test/Sema/debug-93066.cpp
@@ -0,0 +1,14 @@
+// RUN: %clang_cc1 -std=c++23 -fsyntax-only -verify %s
+
+struct S {
+  void f() {
+++this;
+// expected-error@-1 {{expression is not assignable}}
+// expected-note@-2 {{dereference the pointer to modify}}
+  }
+
+  void g() const {
+++this;
+// expected-error@-1 {{expression is not assignable}}
+  }
+};

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


[clang] [llvm] [clang] Fix-it hint for `++this` -> `++*this` when deref is modifiable (PR #94159)

2024-06-02 Thread Rajveer Singh Bharadwaj via cfe-commits

https://github.com/Rajveer100 updated 
https://github.com/llvm/llvm-project/pull/94159

>From e637dc83ec205f7e4dde356b8f5d06ce3abc899e Mon Sep 17 00:00:00 2001
From: Rajveer 
Date: Sun, 2 Jun 2024 18:33:37 +0530
Subject: [PATCH] [clang] Fix-it hint for `++this` -> `++*this` when deref is
 modifiable

Resolves #93066
---
 clang/include/clang/Basic/DiagnosticSemaKinds.td |  3 +++
 clang/lib/Sema/SemaExpr.cpp  | 16 ++--
 clang/test/Sema/debug-93066.cpp  | 14 ++
 debug-84072.cpp  | 16 
 4 files changed, 47 insertions(+), 2 deletions(-)
 create mode 100644 clang/test/Sema/debug-93066.cpp
 create mode 100644 debug-84072.cpp

diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td 
b/clang/include/clang/Basic/DiagnosticSemaKinds.td
index 270b0a1e01307..0f5445296e45f 100644
--- a/clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -8777,6 +8777,9 @@ def err_typecheck_incomplete_type_not_modifiable_lvalue : 
Error<
 def err_typecheck_lvalue_casts_not_supported : Error<
   "assignment to cast is illegal, lvalue casts are not supported">;
 
+def note_typecheck_expression_not_modifiable_lvalue : Note<
+  "dereference the pointer to modify">; 
+
 def err_typecheck_duplicate_vector_components_not_mlvalue : Error<
   "vector is not assignable (contains duplicate components)">;
 def err_block_decl_ref_not_modifiable_lvalue : Error<
diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp
index ff9c5ead36dcf..62cbc8a3a6a45 100644
--- a/clang/lib/Sema/SemaExpr.cpp
+++ b/clang/lib/Sema/SemaExpr.cpp
@@ -13587,10 +13587,22 @@ static bool CheckForModifiableLvalue(Expr *E, 
SourceLocation Loc, Sema ) {
   SourceRange Assign;
   if (Loc != OrigLoc)
 Assign = SourceRange(OrigLoc, OrigLoc);
-  if (NeedType)
+  if (NeedType) {
 S.Diag(Loc, DiagID) << E->getType() << E->getSourceRange() << Assign;
-  else
+  } else {
+ExprResult Deref;
+unsigned FixitDiagID = 0;
+{
+  Sema::TentativeAnalysisScope Trap(S);
+  Deref = S.ActOnUnaryOp(S.getCurScope(), Loc, tok::star, E);
+}
 S.Diag(Loc, DiagID) << E->getSourceRange() << Assign;
+if (Deref.isUsable() &&
+Deref.get()->isModifiableLvalue(S.Context, ) == Expr::MLV_Valid) {
+  FixitDiagID = diag::note_typecheck_expression_not_modifiable_lvalue;
+  S.Diag(Loc, FixitDiagID) << E->getSourceRange() << Assign;
+}
+  }
   return true;
 }
 
diff --git a/clang/test/Sema/debug-93066.cpp b/clang/test/Sema/debug-93066.cpp
new file mode 100644
index 0..7abedcd0d4d80
--- /dev/null
+++ b/clang/test/Sema/debug-93066.cpp
@@ -0,0 +1,14 @@
+// RUN: %clang_cc1 -std=c++23 -fsyntax-only -verify %s
+
+struct S {
+  void f() {
+++this;
+// expected-error@-1 {{expression is not assignable}}
+// expected-note@-2 {{dereference the pointer to modify}}
+  }
+
+  void g() const {
+++this;
+// expected-error@-1 {{expression is not assignable}}
+  }
+};
diff --git a/debug-84072.cpp b/debug-84072.cpp
new file mode 100644
index 0..c024f50019f8c
--- /dev/null
+++ b/debug-84072.cpp
@@ -0,0 +1,16 @@
+void Func(int x) {
+switch (x) {
+[[likely]] case 0:
+case 1:
+int i = 3;
+case 2:
+break;
+}
+switch (x) {
+case 0:
+case 1:
+int i = 3;
+case 2:
+break;
+}
+}

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


[clang] [clang] Fix-it hint for `++this` -> `++*this` when deref is modifiable (PR #94159)

2024-06-02 Thread Rajveer Singh Bharadwaj via cfe-commits

Rajveer100 wrote:

cc @Sirraide 

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


[clang] [clang] Fix-it hint for `++this` -> `++*this` when deref is modifiable (PR #94159)

2024-06-02 Thread Rajveer Singh Bharadwaj via cfe-commits

https://github.com/Rajveer100 created 
https://github.com/llvm/llvm-project/pull/94159

Resolves #93066

>From 9c90d4a83a913566d782774700a06dd640722dfd Mon Sep 17 00:00:00 2001
From: Rajveer 
Date: Sun, 2 Jun 2024 18:33:37 +0530
Subject: [PATCH] [clang] Fix-it hint for `++this` -> `++*this` when deref is
 modifiable

Resolves #93066
---
 clang/include/clang/Basic/DiagnosticSemaKinds.td |  3 +++
 clang/lib/Sema/SemaExpr.cpp  | 15 +--
 clang/test/Sema/debug-93066.cpp  | 14 ++
 3 files changed, 30 insertions(+), 2 deletions(-)
 create mode 100644 clang/test/Sema/debug-93066.cpp

diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td 
b/clang/include/clang/Basic/DiagnosticSemaKinds.td
index 270b0a1e01307..0f5445296e45f 100644
--- a/clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -8777,6 +8777,9 @@ def err_typecheck_incomplete_type_not_modifiable_lvalue : 
Error<
 def err_typecheck_lvalue_casts_not_supported : Error<
   "assignment to cast is illegal, lvalue casts are not supported">;
 
+def note_typecheck_expression_not_modifiable_lvalue : Note<
+  "dereference the pointer to modify">; 
+
 def err_typecheck_duplicate_vector_components_not_mlvalue : Error<
   "vector is not assignable (contains duplicate components)">;
 def err_block_decl_ref_not_modifiable_lvalue : Error<
diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp
index ff9c5ead36dcf..39e7962fcb2a6 100644
--- a/clang/lib/Sema/SemaExpr.cpp
+++ b/clang/lib/Sema/SemaExpr.cpp
@@ -13587,10 +13587,21 @@ static bool CheckForModifiableLvalue(Expr *E, 
SourceLocation Loc, Sema ) {
   SourceRange Assign;
   if (Loc != OrigLoc)
 Assign = SourceRange(OrigLoc, OrigLoc);
-  if (NeedType)
+  if (NeedType) {
 S.Diag(Loc, DiagID) << E->getType() << E->getSourceRange() << Assign;
-  else
+  } else {
+ExprResult Deref;
+unsigned FixitDiagID = 0;
+{
+  Sema::TentativeAnalysisScope Trap(S);
+  Deref = S.ActOnUnaryOp(S.getCurScope(), Loc, tok::star, E);
+}
 S.Diag(Loc, DiagID) << E->getSourceRange() << Assign;
+if (Deref.isUsable() && Deref.get()->isModifiableLvalue(S.Context, ) 
== Expr::MLV_Valid) {
+  FixitDiagID = diag::note_typecheck_expression_not_modifiable_lvalue;
+  S.Diag(Loc, FixitDiagID) << E->getSourceRange() << Assign;
+}
+  }
   return true;
 }
 
diff --git a/clang/test/Sema/debug-93066.cpp b/clang/test/Sema/debug-93066.cpp
new file mode 100644
index 0..7abedcd0d4d80
--- /dev/null
+++ b/clang/test/Sema/debug-93066.cpp
@@ -0,0 +1,14 @@
+// RUN: %clang_cc1 -std=c++23 -fsyntax-only -verify %s
+
+struct S {
+  void f() {
+++this;
+// expected-error@-1 {{expression is not assignable}}
+// expected-note@-2 {{dereference the pointer to modify}}
+  }
+
+  void g() const {
+++this;
+// expected-error@-1 {{expression is not assignable}}
+  }
+};

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


[clang] [clang][analyzer] Check for label location bindings in `DereferenceChecker` (PR #91119)

2024-05-13 Thread Rajveer Singh Bharadwaj via cfe-commits

Rajveer100 wrote:

Thanks for the approval, could you land this for me?

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


[clang] [clang][analyzer] Check for label location bindings in `DereferenceChecker` (PR #91119)

2024-05-10 Thread Rajveer Singh Bharadwaj via cfe-commits

Rajveer100 wrote:

I am not sure what causes the build failure here.

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


[clang] [clang][analyzer] Check for label location bindings in `DereferenceChecker` (PR #91119)

2024-05-07 Thread Rajveer Singh Bharadwaj via cfe-commits

https://github.com/Rajveer100 updated 
https://github.com/llvm/llvm-project/pull/91119

>From 78a2afab67eef9a8a05ced89df0aadb56a2ec2b8 Mon Sep 17 00:00:00 2001
From: Rajveer 
Date: Sun, 5 May 2024 18:05:00 +0530
Subject: [PATCH] [clang][analyzer] Check for label location bindings in
 `DereferenceChecker`

Resolves #89264
---
 .../Checkers/DereferenceChecker.cpp   | 15 ++-
 clang/test/Analysis/gh-issue-89185.c  |  7 +++
 2 files changed, 17 insertions(+), 5 deletions(-)

diff --git a/clang/lib/StaticAnalyzer/Checkers/DereferenceChecker.cpp 
b/clang/lib/StaticAnalyzer/Checkers/DereferenceChecker.cpp
index 1cebfbbee77da..0355eede75eae 100644
--- a/clang/lib/StaticAnalyzer/Checkers/DereferenceChecker.cpp
+++ b/clang/lib/StaticAnalyzer/Checkers/DereferenceChecker.cpp
@@ -31,11 +31,13 @@ class DereferenceChecker
 : public Checker< check::Location,
   check::Bind,
   EventDispatcher > {
-  enum DerefKind { NullPointer, UndefinedPointerValue };
+  enum DerefKind { NullPointer, UndefinedPointerValue, AddressOfLabel };
 
   BugType BT_Null{this, "Dereference of null pointer", categories::LogicError};
   BugType BT_Undef{this, "Dereference of undefined pointer value",
categories::LogicError};
+  BugType BT_Label{this, "Dereference of the address of a label",
+   categories::LogicError};
 
   void reportBug(DerefKind K, ProgramStateRef State, const Stmt *S,
  CheckerContext ) const;
@@ -167,6 +169,11 @@ void DereferenceChecker::reportBug(DerefKind K, 
ProgramStateRef State,
 DerefStr1 = " results in an undefined pointer dereference";
 DerefStr2 = " results in a dereference of an undefined pointer value";
 break;
+  case DerefKind::AddressOfLabel:
+BT = _Label;
+DerefStr1 = " results in an undefined pointer dereference";
+DerefStr2 = " results in a dereference of an address of a label";
+break;
   };
 
   // Generate an error node.
@@ -287,6 +294,12 @@ void DereferenceChecker::checkBind(SVal L, SVal V, const 
Stmt *S,
   if (V.isUndef())
 return;
 
+  // One should never write to label addresses.
+  if (auto Label = L.getAs()) {
+reportBug(DerefKind::AddressOfLabel, C.getState(), S, C);
+return;
+  }
+
   const MemRegion *MR = L.getAsRegion();
   const TypedValueRegion *TVR = dyn_cast_or_null(MR);
   if (!TVR)
diff --git a/clang/test/Analysis/gh-issue-89185.c 
b/clang/test/Analysis/gh-issue-89185.c
index 8a907f198a5fd..27456e7efe885 100644
--- a/clang/test/Analysis/gh-issue-89185.c
+++ b/clang/test/Analysis/gh-issue-89185.c
@@ -7,8 +7,7 @@ void clang_analyzer_dump_ptr(char*);
 void binding_to_label_loc() {
   char *b = &
 MyLabel:
-  *b = 0; // no-crash
-  clang_analyzer_dump_ptr(b); // expected-warning {{&}}
-  clang_analyzer_dump(*b); // expected-warning {{Unknown}}
-  // FIXME: We should never reach here, as storing to a label is invalid.
+  *b = 0; // expected-warning {{Dereference of the address of a label}}
+  clang_analyzer_dump_ptr(b);
+  clang_analyzer_dump(*b);
 }

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


[clang] [clang][analyzer] Check for label location bindings in `DereferenceChecker` (PR #91119)

2024-05-07 Thread Rajveer Singh Bharadwaj via cfe-commits

https://github.com/Rajveer100 updated 
https://github.com/llvm/llvm-project/pull/91119

>From 5c7712d1841664a9424b98abdd22d7967d00913f Mon Sep 17 00:00:00 2001
From: Rajveer 
Date: Sun, 5 May 2024 18:05:00 +0530
Subject: [PATCH] [clang][analyzer] Check for label location bindings in
 `DereferenceChecker`

Resolves #89264
---
 .../StaticAnalyzer/Checkers/DereferenceChecker.cpp | 14 +-
 clang/test/Analysis/gh-issue-89185.c   |  7 +++
 2 files changed, 16 insertions(+), 5 deletions(-)

diff --git a/clang/lib/StaticAnalyzer/Checkers/DereferenceChecker.cpp 
b/clang/lib/StaticAnalyzer/Checkers/DereferenceChecker.cpp
index 1cebfbbee77da..b335cb511546b 100644
--- a/clang/lib/StaticAnalyzer/Checkers/DereferenceChecker.cpp
+++ b/clang/lib/StaticAnalyzer/Checkers/DereferenceChecker.cpp
@@ -31,11 +31,12 @@ class DereferenceChecker
 : public Checker< check::Location,
   check::Bind,
   EventDispatcher > {
-  enum DerefKind { NullPointer, UndefinedPointerValue };
+  enum DerefKind { NullPointer, UndefinedPointerValue, AddressOfLabel };
 
   BugType BT_Null{this, "Dereference of null pointer", categories::LogicError};
   BugType BT_Undef{this, "Dereference of undefined pointer value",
categories::LogicError};
+  BugType BT_Label{this, "Dereference of the address of a label", 
categories::LogicError};
 
   void reportBug(DerefKind K, ProgramStateRef State, const Stmt *S,
  CheckerContext ) const;
@@ -167,6 +168,11 @@ void DereferenceChecker::reportBug(DerefKind K, 
ProgramStateRef State,
 DerefStr1 = " results in an undefined pointer dereference";
 DerefStr2 = " results in a dereference of an undefined pointer value";
 break;
+  case DerefKind::AddressOfLabel:
+BT = _Label;
+DerefStr1 = " results in an undefined pointer dereference";
+DerefStr2 = " results in a dereference of an address of a label";
+break;
   };
 
   // Generate an error node.
@@ -287,6 +293,12 @@ void DereferenceChecker::checkBind(SVal L, SVal V, const 
Stmt *S,
   if (V.isUndef())
 return;
 
+  // One should never write to label addresses.
+  if (auto Label = L.getAs()) {
+reportBug(DerefKind::AddressOfLabel, C.getState(), S, C);
+return;
+  }
+
   const MemRegion *MR = L.getAsRegion();
   const TypedValueRegion *TVR = dyn_cast_or_null(MR);
   if (!TVR)
diff --git a/clang/test/Analysis/gh-issue-89185.c 
b/clang/test/Analysis/gh-issue-89185.c
index 8a907f198a5fd..27456e7efe885 100644
--- a/clang/test/Analysis/gh-issue-89185.c
+++ b/clang/test/Analysis/gh-issue-89185.c
@@ -7,8 +7,7 @@ void clang_analyzer_dump_ptr(char*);
 void binding_to_label_loc() {
   char *b = &
 MyLabel:
-  *b = 0; // no-crash
-  clang_analyzer_dump_ptr(b); // expected-warning {{&}}
-  clang_analyzer_dump(*b); // expected-warning {{Unknown}}
-  // FIXME: We should never reach here, as storing to a label is invalid.
+  *b = 0; // expected-warning {{Dereference of the address of a label}}
+  clang_analyzer_dump_ptr(b);
+  clang_analyzer_dump(*b);
 }

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


[clang] [clang][analyzer] Check for label location bindings in `DereferenceChecker` (PR #91119)

2024-05-06 Thread Rajveer Singh Bharadwaj via cfe-commits

Rajveer100 wrote:

Should we introduce a new Kind in `DerefKind`?

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


[clang] [clang][analyzer] Check for label location bindings in `DereferenceChecker` (PR #91119)

2024-05-05 Thread Rajveer Singh Bharadwaj via cfe-commits

Rajveer100 wrote:

@steakhal 

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


[clang] [clang][analyzer] Check for label location bindings in `DereferenceChecker` (PR #91119)

2024-05-05 Thread Rajveer Singh Bharadwaj via cfe-commits

https://github.com/Rajveer100 updated 
https://github.com/llvm/llvm-project/pull/91119

>From dcc23f7751ba2ceb281a9b027907dbf849ba65c6 Mon Sep 17 00:00:00 2001
From: Rajveer 
Date: Sun, 5 May 2024 18:05:00 +0530
Subject: [PATCH] [clang][analyzer] Check for label location bindings in
 `DereferenceChecker`

Resolves #89264
---
 .../StaticAnalyzer/Checkers/DereferenceChecker.cpp  |  8 
 clang/test/Analysis/Issue89264.c| 13 +
 2 files changed, 21 insertions(+)
 create mode 100644 clang/test/Analysis/Issue89264.c

diff --git a/clang/lib/StaticAnalyzer/Checkers/DereferenceChecker.cpp 
b/clang/lib/StaticAnalyzer/Checkers/DereferenceChecker.cpp
index 1cebfbbee77dae..2d23d23c6c82ba 100644
--- a/clang/lib/StaticAnalyzer/Checkers/DereferenceChecker.cpp
+++ b/clang/lib/StaticAnalyzer/Checkers/DereferenceChecker.cpp
@@ -287,6 +287,14 @@ void DereferenceChecker::checkBind(SVal L, SVal V, const 
Stmt *S,
   if (V.isUndef())
 return;
 
+  // One should never write to label addresses.
+  if (auto Label = L.getAs()) {
+llvm::errs() << "WRITING TO LABEL: " << L << "\n";
+llvm::errs() << "Fatal Error: " << "Dereference of the address of a label"
+ << "\n";
+return;
+  }
+
   const MemRegion *MR = L.getAsRegion();
   const TypedValueRegion *TVR = dyn_cast_or_null(MR);
   if (!TVR)
diff --git a/clang/test/Analysis/Issue89264.c b/clang/test/Analysis/Issue89264.c
new file mode 100644
index 00..1592bc20ee56f2
--- /dev/null
+++ b/clang/test/Analysis/Issue89264.c
@@ -0,0 +1,13 @@
+// RUN: %clang_analyze_cc1 -analyzer-checker=core,debug.ExprInspection -verify 
%s
+
+void clang_analyzer_dump(char);
+void clang_analyzer_dump_ptr(char*);
+
+// https://github.com/llvm/llvm-project/issues/89185
+void binding_to_label_loc() {
+  char *b = &
+MyLabel:
+  *b = 0; // no-crash
+  clang_analyzer_dump_ptr(b); // expected-warning {{&}}
+  clang_analyzer_dump(*b); // expected-warning {{Unknown}}
+}

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


[clang] [clang][analyzer] Check for label location bindings in `DereferenceChecker` (PR #91119)

2024-05-05 Thread Rajveer Singh Bharadwaj via cfe-commits

https://github.com/Rajveer100 updated 
https://github.com/llvm/llvm-project/pull/91119

>From c1d62262d2545e4999f08f2ba28a12c71789926f Mon Sep 17 00:00:00 2001
From: Rajveer 
Date: Sun, 5 May 2024 18:05:00 +0530
Subject: [PATCH] [clang][analyzer] Check for label location bindings in
 `DereferenceChecker`

Resolves #89264
---
 .../StaticAnalyzer/Checkers/DereferenceChecker.cpp  |  9 +
 clang/test/Analysis/Issue89264.c| 13 +
 2 files changed, 22 insertions(+)
 create mode 100644 clang/test/Analysis/Issue89264.c

diff --git a/clang/lib/StaticAnalyzer/Checkers/DereferenceChecker.cpp 
b/clang/lib/StaticAnalyzer/Checkers/DereferenceChecker.cpp
index 1cebfbbee77dae..36593d84dac583 100644
--- a/clang/lib/StaticAnalyzer/Checkers/DereferenceChecker.cpp
+++ b/clang/lib/StaticAnalyzer/Checkers/DereferenceChecker.cpp
@@ -287,6 +287,15 @@ void DereferenceChecker::checkBind(SVal L, SVal V, const 
Stmt *S,
   if (V.isUndef())
 return;
 
+  // One should never write to label addresses.
+  if (auto Label = L.getAs()) {
+llvm::errs() << "WRITING TO LABEL: " << L << "\n";
+llvm::errs() << "Fatal Error: "
+ << "Dereference of the address of a label"
+ << "\n";
+return;
+  }
+
   const MemRegion *MR = L.getAsRegion();
   const TypedValueRegion *TVR = dyn_cast_or_null(MR);
   if (!TVR)
diff --git a/clang/test/Analysis/Issue89264.c b/clang/test/Analysis/Issue89264.c
new file mode 100644
index 00..1592bc20ee56f2
--- /dev/null
+++ b/clang/test/Analysis/Issue89264.c
@@ -0,0 +1,13 @@
+// RUN: %clang_analyze_cc1 -analyzer-checker=core,debug.ExprInspection -verify 
%s
+
+void clang_analyzer_dump(char);
+void clang_analyzer_dump_ptr(char*);
+
+// https://github.com/llvm/llvm-project/issues/89185
+void binding_to_label_loc() {
+  char *b = &
+MyLabel:
+  *b = 0; // no-crash
+  clang_analyzer_dump_ptr(b); // expected-warning {{&}}
+  clang_analyzer_dump(*b); // expected-warning {{Unknown}}
+}

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


[clang] [clang][analyzer] Check for label location bindings in `DereferenceChecker` (PR #91119)

2024-05-05 Thread Rajveer Singh Bharadwaj via cfe-commits

https://github.com/Rajveer100 created 
https://github.com/llvm/llvm-project/pull/91119

Resolves #89264

Values should not be stored in addresses of labels, this throws a fatal error 
when this happens.

>From 36b1ee31d8d740cdbee6a1787d7ef81d6abeb8ad Mon Sep 17 00:00:00 2001
From: Rajveer 
Date: Sun, 5 May 2024 18:05:00 +0530
Subject: [PATCH] [clang][analyzer] Check for label location bindings in
 `DereferenceChecker`

Resolves #89264
---
 .../StaticAnalyzer/Checkers/DereferenceChecker.cpp  |  7 +++
 clang/test/Analysis/Issue89264.c| 13 +
 2 files changed, 20 insertions(+)
 create mode 100644 clang/test/Analysis/Issue89264.c

diff --git a/clang/lib/StaticAnalyzer/Checkers/DereferenceChecker.cpp 
b/clang/lib/StaticAnalyzer/Checkers/DereferenceChecker.cpp
index 1cebfbbee77dae..a1770e15ad7d52 100644
--- a/clang/lib/StaticAnalyzer/Checkers/DereferenceChecker.cpp
+++ b/clang/lib/StaticAnalyzer/Checkers/DereferenceChecker.cpp
@@ -286,6 +286,13 @@ void DereferenceChecker::checkBind(SVal L, SVal V, const 
Stmt *S,
   // If we're binding to a reference, check if the value is known to be null.
   if (V.isUndef())
 return;
+
+  // One should never write to label addresses.
+  if (auto Label = L.getAs()) {
+llvm::errs() << "WRITING TO LABEL: " << L << "\n";
+llvm::errs() << "Fatal Error: " << "Dereference of the address of a label" 
<< "\n";
+return;
+  }
 
   const MemRegion *MR = L.getAsRegion();
   const TypedValueRegion *TVR = dyn_cast_or_null(MR);
diff --git a/clang/test/Analysis/Issue89264.c b/clang/test/Analysis/Issue89264.c
new file mode 100644
index 00..1592bc20ee56f2
--- /dev/null
+++ b/clang/test/Analysis/Issue89264.c
@@ -0,0 +1,13 @@
+// RUN: %clang_analyze_cc1 -analyzer-checker=core,debug.ExprInspection -verify 
%s
+
+void clang_analyzer_dump(char);
+void clang_analyzer_dump_ptr(char*);
+
+// https://github.com/llvm/llvm-project/issues/89185
+void binding_to_label_loc() {
+  char *b = &
+MyLabel:
+  *b = 0; // no-crash
+  clang_analyzer_dump_ptr(b); // expected-warning {{&}}
+  clang_analyzer_dump(*b); // expected-warning {{Unknown}}
+}

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


[clang] [clang] Fix crash when inheriting from a cv-qualified type (PR #70594)

2024-04-02 Thread Rajveer Singh Bharadwaj via cfe-commits

Rajveer100 wrote:

@shafik 
Could you land this for me?

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


[clang] [clang] Fix crash when inheriting from a cv-qualified type (PR #70594)

2024-04-02 Thread Rajveer Singh Bharadwaj via cfe-commits

https://github.com/Rajveer100 updated 
https://github.com/llvm/llvm-project/pull/70594

>From caabd75b0223408ad62baff3d9d6d7f7d78c4c7f Mon Sep 17 00:00:00 2001
From: Rajveer 
Date: Sun, 29 Oct 2023 18:37:17 +0530
Subject: [PATCH] [clang] Fix a crash in debug mode

Resolves Issue #35603

This bug was caused due to the assertions being too strict,
loosened by stripping qualifiers from the base class but not
from the type of the initializer.

Added Release Notes for the same.
---
 clang/docs/ReleaseNotes.rst|  3 +++
 clang/lib/AST/ExprConstant.cpp |  2 +-
 clang/test/Sema/GH70594.cpp| 28 
 3 files changed, 32 insertions(+), 1 deletion(-)
 create mode 100644 clang/test/Sema/GH70594.cpp

diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 3a84ff16a1e4d4..d5ce54e185600c 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -486,6 +486,9 @@ Bug Fixes to C++ Support
 - Fixed a bug that prevented member function templates of class templates 
declared with a deduced return type
   from being explicitly specialized for a given implicit instantiation of the 
class template.
 
+- Fix crash when inheriting from a cv-qualified type. Fixes:
+  (`#35603 `_)
+
 Bug Fixes to AST Handling
 ^
 - Clang now properly preserves ``FoundDecls`` within a ``ConceptReference``. 
(#GH82628)
diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp
index 0058e86519985e..88c8eaf6ef9b6e 100644
--- a/clang/lib/AST/ExprConstant.cpp
+++ b/clang/lib/AST/ExprConstant.cpp
@@ -6456,7 +6456,7 @@ static bool HandleConstructorCall(const Expr *E, const 
LValue ,
   // Non-virtual base classes are initialized in the order in the class
   // definition. We have already checked for virtual base classes.
   assert(!BaseIt->isVirtual() && "virtual base for literal type");
-  assert(Info.Ctx.hasSameType(BaseIt->getType(), BaseType) &&
+  assert(Info.Ctx.hasSameUnqualifiedType(BaseIt->getType(), BaseType) &&
  "base class initializers not in expected order");
   ++BaseIt;
 #endif
diff --git a/clang/test/Sema/GH70594.cpp b/clang/test/Sema/GH70594.cpp
new file mode 100644
index 00..ce98e9b12b5cba
--- /dev/null
+++ b/clang/test/Sema/GH70594.cpp
@@ -0,0 +1,28 @@
+// RUN: %clang_cc1 -fsyntax-only -std=c++11 %s -verify
+// RUN: %clang_cc1 -fsyntax-only -std=c++23 %s -verify
+
+// expected-no-diagnostics
+
+struct A {};
+using CA = const A;
+
+struct S1 : CA {
+  constexpr S1() : CA() {}
+};
+
+struct S2 : A {
+  constexpr S2() : CA() {}
+};
+
+struct S3 : CA {
+  constexpr S3() : A() {}
+};
+
+struct Int {};
+
+template 
+struct __tuple_leaf : _Hp {
+  constexpr __tuple_leaf() : _Hp() {}
+};
+
+constexpr __tuple_leaf t;

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


[clang] [clang] Fix crash when inheriting from a cv-qualified type (PR #70594)

2024-04-02 Thread Rajveer Singh Bharadwaj via cfe-commits

https://github.com/Rajveer100 updated 
https://github.com/llvm/llvm-project/pull/70594

>From f2a9a4137d39dd9f3896c64f41d5700774ec9204 Mon Sep 17 00:00:00 2001
From: Rajveer 
Date: Sun, 29 Oct 2023 18:37:17 +0530
Subject: [PATCH] [clang] Fix a crash in debug mode

Resolves Issue #35603

This bug was caused due to the assertions being too strict,
loosened by stripping qualifiers from the base class but not
from the type of the initializer.

Added Release Notes for the same.
---
 clang/docs/ReleaseNotes.rst|  3 +++
 clang/lib/AST/ExprConstant.cpp |  2 +-
 clang/test/Sema/GH70594.cpp| 28 
 3 files changed, 32 insertions(+), 1 deletion(-)
 create mode 100644 clang/test/Sema/GH70594.cpp

diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 93cc5291e2391fb..07aad91e3e2b322 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -390,6 +390,9 @@ Bug Fixes to C++ Support
 - Fixed a crash while checking constraints of a trailing requires-expression 
of a lambda, that the
   expression references to an entity declared outside of the lambda. (#GH64808)
 
+- Fix crash when inheriting from a cv-qualified type. Fixes:
+  (`#35603 `_)
+
 Bug Fixes to AST Handling
 ^
 - Clang now properly preserves ``FoundDecls`` within a ``ConceptReference``. 
(#GH82628)
diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp
index 7137efb7876de2b..753bbcc94db4f44 100644
--- a/clang/lib/AST/ExprConstant.cpp
+++ b/clang/lib/AST/ExprConstant.cpp
@@ -6453,7 +6453,7 @@ static bool HandleConstructorCall(const Expr *E, const 
LValue ,
   // Non-virtual base classes are initialized in the order in the class
   // definition. We have already checked for virtual base classes.
   assert(!BaseIt->isVirtual() && "virtual base for literal type");
-  assert(Info.Ctx.hasSameType(BaseIt->getType(), BaseType) &&
+  assert(Info.Ctx.hasSameUnqualifiedType(BaseIt->getType(), BaseType) &&
  "base class initializers not in expected order");
   ++BaseIt;
 #endif
diff --git a/clang/test/Sema/GH70594.cpp b/clang/test/Sema/GH70594.cpp
new file mode 100644
index 000..ce98e9b12b5cba3
--- /dev/null
+++ b/clang/test/Sema/GH70594.cpp
@@ -0,0 +1,28 @@
+// RUN: %clang_cc1 -fsyntax-only -std=c++11 %s -verify
+// RUN: %clang_cc1 -fsyntax-only -std=c++23 %s -verify
+
+// expected-no-diagnostics
+
+struct A {};
+using CA = const A;
+
+struct S1 : CA {
+  constexpr S1() : CA() {}
+};
+
+struct S2 : A {
+  constexpr S2() : CA() {}
+};
+
+struct S3 : CA {
+  constexpr S3() : A() {}
+};
+
+struct Int {};
+
+template 
+struct __tuple_leaf : _Hp {
+  constexpr __tuple_leaf() : _Hp() {}
+};
+
+constexpr __tuple_leaf t;

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


[clang] [clang] Clang should detect illegal copy constructor with template class as its parameter (PR #81251)

2024-02-29 Thread Rajveer Singh Bharadwaj via cfe-commits

Rajveer100 wrote:

I have removed this entirely, although it still may not be optimal, it did 
reduce few more test failures:

```C++
Constructor->getTemplateSpecializationKind() !=
  TSK_ImplicitInstantiation
```

Any particular suggestions apart from updating the tests?

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


[clang] [clang] Clang should detect illegal copy constructor with template class as its parameter (PR #81251)

2024-02-25 Thread Rajveer Singh Bharadwaj via cfe-commits

https://github.com/Rajveer100 updated 
https://github.com/llvm/llvm-project/pull/81251

>From bf51e9dfb160ec32b3f3a7d052c1da24f06a Mon Sep 17 00:00:00 2001
From: Rajveer 
Date: Fri, 9 Feb 2024 19:20:39 +0530
Subject: [PATCH] [clang] Clang should detect illegal copy constructor with
 template class as its parameter

Resolves #80963
---
 clang/docs/ReleaseNotes.rst|  2 ++
 clang/lib/Sema/SemaDeclCXX.cpp |  4 +---
 clang/test/SemaCXX/GH81251.cpp | 17 +
 3 files changed, 20 insertions(+), 3 deletions(-)
 create mode 100644 clang/test/SemaCXX/GH81251.cpp

diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 529dd783ab7382..d30e13b0b1b62c 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -281,6 +281,8 @@ Bug Fixes to C++ Support
   a requires-clause lie at the same depth as those of the surrounding lambda. 
This,
   in turn, results in the wrong template argument substitution during 
constraint checking.
   (`#78524 `_)
+- Clang now detects illegal copy constructor with template class as its 
parameter.
+  Fixes (`#80963 https://github.com/llvm/llvm-project/issues/80963>`_)
 
 Bug Fixes to AST Handling
 ^
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp
index 7c009d9c8ec093..622bf0c258f138 100644
--- a/clang/lib/Sema/SemaDeclCXX.cpp
+++ b/clang/lib/Sema/SemaDeclCXX.cpp
@@ -10921,9 +10921,7 @@ void Sema::CheckConstructor(CXXConstructorDecl 
*Constructor) {
   //   either there are no other parameters or else all other
   //   parameters have default arguments.
   if (!Constructor->isInvalidDecl() &&
-  Constructor->hasOneParamOrDefaultArgs() &&
-  Constructor->getTemplateSpecializationKind() !=
-  TSK_ImplicitInstantiation) {
+  Constructor->hasOneParamOrDefaultArgs()) {
 QualType ParamType = Constructor->getParamDecl(0)->getType();
 QualType ClassTy = Context.getTagDeclType(ClassDecl);
 if (Context.getCanonicalType(ParamType).getUnqualifiedType() == ClassTy) {
diff --git a/clang/test/SemaCXX/GH81251.cpp b/clang/test/SemaCXX/GH81251.cpp
new file mode 100644
index 00..a3e0ba07728dcc
--- /dev/null
+++ b/clang/test/SemaCXX/GH81251.cpp
@@ -0,0 +1,17 @@
+// RUN: %clang_cc1 -fsyntax-only -verify %s
+
+template < class T, class V > struct A
+{
+A ();
+A (A &);
+A (A < V,T >);
+// expected-error@-1 {{copy constructor must pass its first argument by 
reference}}
+};
+
+void f ()
+{
+A  (A < int, int >());
+// expected-note@-1 {{in instantiation of template class 'A' 
requested here}}
+
+A  (A < int, double >());
+}

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


[clang] [clang] Clang should detect illegal copy constructor with template class as its parameter (PR #81251)

2024-02-25 Thread Rajveer Singh Bharadwaj via cfe-commits

https://github.com/Rajveer100 updated 
https://github.com/llvm/llvm-project/pull/81251

>From 4bb6d4d1b5a813bc3a60c1bc6aab97ea863bd261 Mon Sep 17 00:00:00 2001
From: Rajveer 
Date: Fri, 9 Feb 2024 19:20:39 +0530
Subject: [PATCH] [clang] Clang should detect illegal copy constructor with
 template class as its parameter

Resolves #80963
---
 clang/docs/ReleaseNotes.rst|  2 ++
 clang/lib/Sema/SemaDeclCXX.cpp |  4 +---
 clang/test/SemaCXX/GH81251.cpp | 17 +
 3 files changed, 20 insertions(+), 3 deletions(-)
 create mode 100644 clang/test/SemaCXX/GH81251.cpp

diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 529dd783ab7382..4c46c9bae78313 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -281,6 +281,8 @@ Bug Fixes to C++ Support
   a requires-clause lie at the same depth as those of the surrounding lambda. 
This,
   in turn, results in the wrong template argument substitution during 
constraint checking.
   (`#78524 `_)
+- Clang now detects illegal copy constructor with template class as its 
parameter.
+  Fixes (`#80963 https://github.com/llvm/llvm-project/issues/80963`_)
 
 Bug Fixes to AST Handling
 ^
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp
index 7c009d9c8ec093..622bf0c258f138 100644
--- a/clang/lib/Sema/SemaDeclCXX.cpp
+++ b/clang/lib/Sema/SemaDeclCXX.cpp
@@ -10921,9 +10921,7 @@ void Sema::CheckConstructor(CXXConstructorDecl 
*Constructor) {
   //   either there are no other parameters or else all other
   //   parameters have default arguments.
   if (!Constructor->isInvalidDecl() &&
-  Constructor->hasOneParamOrDefaultArgs() &&
-  Constructor->getTemplateSpecializationKind() !=
-  TSK_ImplicitInstantiation) {
+  Constructor->hasOneParamOrDefaultArgs()) {
 QualType ParamType = Constructor->getParamDecl(0)->getType();
 QualType ClassTy = Context.getTagDeclType(ClassDecl);
 if (Context.getCanonicalType(ParamType).getUnqualifiedType() == ClassTy) {
diff --git a/clang/test/SemaCXX/GH81251.cpp b/clang/test/SemaCXX/GH81251.cpp
new file mode 100644
index 00..a3e0ba07728dcc
--- /dev/null
+++ b/clang/test/SemaCXX/GH81251.cpp
@@ -0,0 +1,17 @@
+// RUN: %clang_cc1 -fsyntax-only -verify %s
+
+template < class T, class V > struct A
+{
+A ();
+A (A &);
+A (A < V,T >);
+// expected-error@-1 {{copy constructor must pass its first argument by 
reference}}
+};
+
+void f ()
+{
+A  (A < int, int >());
+// expected-note@-1 {{in instantiation of template class 'A' 
requested here}}
+
+A  (A < int, double >());
+}

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


[clang] [clang] Clang should detect illegal copy constructor with template class as its parameter (PR #81251)

2024-02-25 Thread Rajveer Singh Bharadwaj via cfe-commits

https://github.com/Rajveer100 updated 
https://github.com/llvm/llvm-project/pull/81251

>From 5c5a91dbdf7239025d7bc5961afc0f375d3b1627 Mon Sep 17 00:00:00 2001
From: Rajveer 
Date: Fri, 9 Feb 2024 19:20:39 +0530
Subject: [PATCH] [clang] Clang should detect illegal copy constructor with
 template class as its parameter

Resolves #80963
---
 clang/docs/ReleaseNotes.rst|  3 +++
 clang/lib/Sema/SemaDeclCXX.cpp |  4 +---
 clang/test/SemaCXX/GH81251.cpp | 17 +
 3 files changed, 21 insertions(+), 3 deletions(-)
 create mode 100644 clang/test/SemaCXX/GH81251.cpp

diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 529dd783ab7382..8bd80a199ed3b0 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -281,6 +281,9 @@ Bug Fixes to C++ Support
   a requires-clause lie at the same depth as those of the surrounding lambda. 
This,
   in turn, results in the wrong template argument substitution during 
constraint checking.
   (`#78524 `_)
+  (`#782154 `_`)
+- Clang now detects illegal copy constructor with template class as its 
parameter.
+  Fixes (`#80963 https://github.com/llvm/llvm-project/issues/80963`_)
 
 Bug Fixes to AST Handling
 ^
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp
index 7c009d9c8ec093..622bf0c258f138 100644
--- a/clang/lib/Sema/SemaDeclCXX.cpp
+++ b/clang/lib/Sema/SemaDeclCXX.cpp
@@ -10921,9 +10921,7 @@ void Sema::CheckConstructor(CXXConstructorDecl 
*Constructor) {
   //   either there are no other parameters or else all other
   //   parameters have default arguments.
   if (!Constructor->isInvalidDecl() &&
-  Constructor->hasOneParamOrDefaultArgs() &&
-  Constructor->getTemplateSpecializationKind() !=
-  TSK_ImplicitInstantiation) {
+  Constructor->hasOneParamOrDefaultArgs()) {
 QualType ParamType = Constructor->getParamDecl(0)->getType();
 QualType ClassTy = Context.getTagDeclType(ClassDecl);
 if (Context.getCanonicalType(ParamType).getUnqualifiedType() == ClassTy) {
diff --git a/clang/test/SemaCXX/GH81251.cpp b/clang/test/SemaCXX/GH81251.cpp
new file mode 100644
index 00..a3e0ba07728dcc
--- /dev/null
+++ b/clang/test/SemaCXX/GH81251.cpp
@@ -0,0 +1,17 @@
+// RUN: %clang_cc1 -fsyntax-only -verify %s
+
+template < class T, class V > struct A
+{
+A ();
+A (A &);
+A (A < V,T >);
+// expected-error@-1 {{copy constructor must pass its first argument by 
reference}}
+};
+
+void f ()
+{
+A  (A < int, int >());
+// expected-note@-1 {{in instantiation of template class 'A' 
requested here}}
+
+A  (A < int, double >());
+}

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


[clang] [clang] Clang should detect illegal copy constructor with template class as its parameter (PR #81251)

2024-02-25 Thread Rajveer Singh Bharadwaj via cfe-commits

https://github.com/Rajveer100 updated 
https://github.com/llvm/llvm-project/pull/81251

>From 7c58bd55bdd5c9a9cc838fec35e957f7952b2b52 Mon Sep 17 00:00:00 2001
From: Rajveer 
Date: Fri, 9 Feb 2024 19:20:39 +0530
Subject: [PATCH] [clang] Clang should detect illegal copy constructor with
 template class as its parameter

Resolves #80963
---
 clang/docs/ReleaseNotes.rst|  2 ++
 clang/lib/Sema/SemaDeclCXX.cpp |  4 +---
 clang/test/SemaCXX/GH81251.cpp | 17 +
 3 files changed, 20 insertions(+), 3 deletions(-)
 create mode 100644 clang/test/SemaCXX/GH81251.cpp

diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 649ad655905af2..fb213714e636ea 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -267,6 +267,8 @@ Bug Fixes to C++ Support
   was only accepted at namespace scope but not at local function scope.
 - Clang no longer tries to call consteval constructors at runtime when they 
appear in a member initializer.
   (`#782154 `_`)
+- Clang now detects illegal copy constructor with template class as its 
parameter.
+  Fixes (`#80963 https://github.com/llvm/llvm-project/issues/80963`_)
 
 Bug Fixes to AST Handling
 ^
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp
index 79263bc3ff671d..5ac250d60c9a36 100644
--- a/clang/lib/Sema/SemaDeclCXX.cpp
+++ b/clang/lib/Sema/SemaDeclCXX.cpp
@@ -10921,9 +10921,7 @@ void Sema::CheckConstructor(CXXConstructorDecl 
*Constructor) {
   //   either there are no other parameters or else all other
   //   parameters have default arguments.
   if (!Constructor->isInvalidDecl() &&
-  Constructor->hasOneParamOrDefaultArgs() &&
-  Constructor->getTemplateSpecializationKind() !=
-  TSK_ImplicitInstantiation) {
+  Constructor->hasOneParamOrDefaultArgs()) {
 QualType ParamType = Constructor->getParamDecl(0)->getType();
 QualType ClassTy = Context.getTagDeclType(ClassDecl);
 if (Context.getCanonicalType(ParamType).getUnqualifiedType() == ClassTy) {
diff --git a/clang/test/SemaCXX/GH81251.cpp b/clang/test/SemaCXX/GH81251.cpp
new file mode 100644
index 00..a3e0ba07728dcc
--- /dev/null
+++ b/clang/test/SemaCXX/GH81251.cpp
@@ -0,0 +1,17 @@
+// RUN: %clang_cc1 -fsyntax-only -verify %s
+
+template < class T, class V > struct A
+{
+A ();
+A (A &);
+A (A < V,T >);
+// expected-error@-1 {{copy constructor must pass its first argument by 
reference}}
+};
+
+void f ()
+{
+A  (A < int, int >());
+// expected-note@-1 {{in instantiation of template class 'A' 
requested here}}
+
+A  (A < int, double >());
+}

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


[clang] [clang] Clang should detect illegal copy constructor with template class as its parameter (PR #81251)

2024-02-25 Thread Rajveer Singh Bharadwaj via cfe-commits

https://github.com/Rajveer100 edited 
https://github.com/llvm/llvm-project/pull/81251
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [clang] Fix crash when inheriting from a cv-qualified type (PR #70594)

2024-02-22 Thread Rajveer Singh Bharadwaj via cfe-commits

https://github.com/Rajveer100 updated 
https://github.com/llvm/llvm-project/pull/70594

>From a27a6858e44047bc0ff55485355932259e2f9358 Mon Sep 17 00:00:00 2001
From: Rajveer 
Date: Sun, 29 Oct 2023 18:37:17 +0530
Subject: [PATCH] [clang] Fix a crash in debug mode

Resolves Issue #35603

This bug was caused due to the assertions being too strict,
loosened by stripping qualifiers from the base class but not
from the type of the initializer.

Added Release Notes for the same.
---
 clang/docs/ReleaseNotes.rst|  3 +++
 clang/lib/AST/ExprConstant.cpp |  2 +-
 clang/test/Sema/GH70594.cpp| 19 +++
 3 files changed, 23 insertions(+), 1 deletion(-)
 create mode 100644 clang/test/Sema/GH70594.cpp

diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 649ad655905af23..5087ec04fc17ded 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -268,6 +268,9 @@ Bug Fixes to C++ Support
 - Clang no longer tries to call consteval constructors at runtime when they 
appear in a member initializer.
   (`#782154 `_`)
 
+- Fix crash when inheriting from a cv-qualified type. Fixes:
+  (`#35603 `_)
+
 Bug Fixes to AST Handling
 ^
 
diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp
index fcf8f6591a79234..28709fb2556d3f7 100644
--- a/clang/lib/AST/ExprConstant.cpp
+++ b/clang/lib/AST/ExprConstant.cpp
@@ -6421,7 +6421,7 @@ static bool HandleConstructorCall(const Expr *E, const 
LValue ,
   // Non-virtual base classes are initialized in the order in the class
   // definition. We have already checked for virtual base classes.
   assert(!BaseIt->isVirtual() && "virtual base for literal type");
-  assert(Info.Ctx.hasSameType(BaseIt->getType(), BaseType) &&
+  assert(Info.Ctx.hasSameUnqualifiedType(BaseIt->getType(), BaseType) &&
  "base class initializers not in expected order");
   ++BaseIt;
 #endif
diff --git a/clang/test/Sema/GH70594.cpp b/clang/test/Sema/GH70594.cpp
new file mode 100644
index 000..853552108ec2b67
--- /dev/null
+++ b/clang/test/Sema/GH70594.cpp
@@ -0,0 +1,19 @@
+// RUN: %clang_cc1 -fsyntax-only -std=c++11 %s -verify
+// RUN: %clang_cc1 -fsyntax-only -std=c++23 %s -verify
+
+// expected-no-diagnostics
+
+struct A {};
+using CA = const A;
+
+struct S1 : CA {
+  constexpr S1() : CA() {}
+};
+
+struct S2 : A {
+  constexpr S2() : CA() {}
+};
+
+struct S3 : CA {
+  constexpr S3() : A() {}
+};

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


[clang] [clang] [SemaCXX] Disallow deducing "this" on operator `new` and `delete` (PR #82251)

2024-02-21 Thread Rajveer Singh Bharadwaj via cfe-commits

Rajveer100 wrote:

Considering the PR sounds good to you, yes it would be great to have it merged.

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


[clang] [clang] [SemaCXX] Disallow deducing "this" on operator `new` and `delete` (PR #82251)

2024-02-21 Thread Rajveer Singh Bharadwaj via cfe-commits

Rajveer100 wrote:

> @Rajveer100 you need us to merge that for you?

I am not sure what you meant by this?

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


[clang] [clang] [SemaCXX] Disallow deducing "this" on operator `new` and `delete` (PR #82251)

2024-02-21 Thread Rajveer Singh Bharadwaj via cfe-commits

https://github.com/Rajveer100 updated 
https://github.com/llvm/llvm-project/pull/82251

>From 05dbfac2043c22bdb73d5f09221421209bfe1f22 Mon Sep 17 00:00:00 2001
From: Rajveer 
Date: Mon, 19 Feb 2024 19:29:48 +0530
Subject: [PATCH] [clang] [SemaCXX] Disallow deducing "this" on operator `new`
 and `delete`

Resolves Issue #82249
---
 clang/docs/ReleaseNotes.rst| 2 ++
 clang/lib/Sema/SemaDeclCXX.cpp | 4 +++-
 clang/test/SemaCXX/cxx2b-deducing-this.cpp | 4 
 3 files changed, 9 insertions(+), 1 deletion(-)

diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 649ad655905af2..213a864d25dcae 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -254,6 +254,8 @@ Bug Fixes to C++ Support
   Fixes (`#68490 `_)
 - Fix a crash when trying to call a varargs function that also has an explicit 
object parameter.
   Fixes (`#80971 ICE when explicit object parameter be a function parameter 
pack`)
+- Reject explicit object parameters on `new` and `delete` operators.
+  Fixes (`#82249 ` _)
 - Fixed a bug where abbreviated function templates would append their invented 
template parameters to
   an empty template parameter lists.
 - Clang now classifies aggregate initialization in C++17 and newer as constant
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp
index 79263bc3ff671d..7c009d9c8ec093 100644
--- a/clang/lib/Sema/SemaDeclCXX.cpp
+++ b/clang/lib/Sema/SemaDeclCXX.cpp
@@ -11395,7 +11395,9 @@ void Sema::CheckExplicitObjectMemberFunction(Declarator 
,
 << ExplicitObjectParam->getSourceRange();
   }
 
-  if (D.getDeclSpec().getStorageClassSpec() == DeclSpec::SCS_static) {
+  if (D.getDeclSpec().getStorageClassSpec() == DeclSpec::SCS_static ||
+  (D.getContext() == clang::DeclaratorContext::Member &&
+   D.isStaticMember())) {
 Diag(ExplicitObjectParam->getBeginLoc(),
  diag::err_explicit_object_parameter_nonmember)
 << D.getSourceRange() << /*static=*/0 << IsLambda;
diff --git a/clang/test/SemaCXX/cxx2b-deducing-this.cpp 
b/clang/test/SemaCXX/cxx2b-deducing-this.cpp
index 30131d6adc4db0..b8ddb9ad300034 100644
--- a/clang/test/SemaCXX/cxx2b-deducing-this.cpp
+++ b/clang/test/SemaCXX/cxx2b-deducing-this.cpp
@@ -16,6 +16,10 @@ struct S {
 static void f(this auto); // expected-error{{an explicit object parameter 
cannot appear in a static function}}
 virtual void f(this S); // expected-error{{an explicit object parameter 
cannot appear in a virtual function}}
 
+// new and delete are implicitly static
+void *operator new(this unsigned long); // expected-error{{an explicit 
object parameter cannot appear in a static function}}
+void operator delete(this void*); // expected-error{{an explicit object 
parameter cannot appear in a static function}}
+
 void g(this auto) const; // expected-error{{explicit object member 
function cannot have 'const' qualifier}}
 void h(this auto) &; // expected-error{{explicit object member function 
cannot have '&' qualifier}}
 void i(this auto) &&; // expected-error{{explicit object member function 
cannot have '&&' qualifier}}

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


[clang] [clang] [SemaCXX] Disallow deducing "this" on operator `new` and `delete` (PR #82251)

2024-02-21 Thread Rajveer Singh Bharadwaj via cfe-commits

Rajveer100 wrote:

@cor3ntin 
I have mistakenly added a merge commit, let me fix that.


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


[clang] [clang] [SemaCXX] Disallow deducing "this" on operator `new` and `delete` (PR #82251)

2024-02-21 Thread Rajveer Singh Bharadwaj via cfe-commits

https://github.com/Rajveer100 updated 
https://github.com/llvm/llvm-project/pull/82251

>From 05dbfac2043c22bdb73d5f09221421209bfe1f22 Mon Sep 17 00:00:00 2001
From: Rajveer 
Date: Mon, 19 Feb 2024 19:29:48 +0530
Subject: [PATCH] [clang] [SemaCXX] Disallow deducing "this" on operator `new`
 and `delete`

Resolves Issue #82249
---
 clang/docs/ReleaseNotes.rst| 2 ++
 clang/lib/Sema/SemaDeclCXX.cpp | 4 +++-
 clang/test/SemaCXX/cxx2b-deducing-this.cpp | 4 
 3 files changed, 9 insertions(+), 1 deletion(-)

diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 649ad655905af2..213a864d25dcae 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -254,6 +254,8 @@ Bug Fixes to C++ Support
   Fixes (`#68490 `_)
 - Fix a crash when trying to call a varargs function that also has an explicit 
object parameter.
   Fixes (`#80971 ICE when explicit object parameter be a function parameter 
pack`)
+- Reject explicit object parameters on `new` and `delete` operators.
+  Fixes (`#82249 ` _)
 - Fixed a bug where abbreviated function templates would append their invented 
template parameters to
   an empty template parameter lists.
 - Clang now classifies aggregate initialization in C++17 and newer as constant
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp
index 79263bc3ff671d..7c009d9c8ec093 100644
--- a/clang/lib/Sema/SemaDeclCXX.cpp
+++ b/clang/lib/Sema/SemaDeclCXX.cpp
@@ -11395,7 +11395,9 @@ void Sema::CheckExplicitObjectMemberFunction(Declarator 
,
 << ExplicitObjectParam->getSourceRange();
   }
 
-  if (D.getDeclSpec().getStorageClassSpec() == DeclSpec::SCS_static) {
+  if (D.getDeclSpec().getStorageClassSpec() == DeclSpec::SCS_static ||
+  (D.getContext() == clang::DeclaratorContext::Member &&
+   D.isStaticMember())) {
 Diag(ExplicitObjectParam->getBeginLoc(),
  diag::err_explicit_object_parameter_nonmember)
 << D.getSourceRange() << /*static=*/0 << IsLambda;
diff --git a/clang/test/SemaCXX/cxx2b-deducing-this.cpp 
b/clang/test/SemaCXX/cxx2b-deducing-this.cpp
index 30131d6adc4db0..b8ddb9ad300034 100644
--- a/clang/test/SemaCXX/cxx2b-deducing-this.cpp
+++ b/clang/test/SemaCXX/cxx2b-deducing-this.cpp
@@ -16,6 +16,10 @@ struct S {
 static void f(this auto); // expected-error{{an explicit object parameter 
cannot appear in a static function}}
 virtual void f(this S); // expected-error{{an explicit object parameter 
cannot appear in a virtual function}}
 
+// new and delete are implicitly static
+void *operator new(this unsigned long); // expected-error{{an explicit 
object parameter cannot appear in a static function}}
+void operator delete(this void*); // expected-error{{an explicit object 
parameter cannot appear in a static function}}
+
 void g(this auto) const; // expected-error{{explicit object member 
function cannot have 'const' qualifier}}
 void h(this auto) &; // expected-error{{explicit object member function 
cannot have '&' qualifier}}
 void i(this auto) &&; // expected-error{{explicit object member function 
cannot have '&&' qualifier}}

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


[clang] [clang] [SemaCXX] Disallow deducing "this" on operator `new` and `delete` (PR #82251)

2024-02-19 Thread Rajveer Singh Bharadwaj via cfe-commits

https://github.com/Rajveer100 updated 
https://github.com/llvm/llvm-project/pull/82251

>From 05dbfac2043c22bdb73d5f09221421209bfe1f22 Mon Sep 17 00:00:00 2001
From: Rajveer 
Date: Mon, 19 Feb 2024 19:29:48 +0530
Subject: [PATCH] [clang] [SemaCXX] Disallow deducing "this" on operator `new`
 and `delete`

Resolves Issue #82249
---
 clang/docs/ReleaseNotes.rst| 2 ++
 clang/lib/Sema/SemaDeclCXX.cpp | 4 +++-
 clang/test/SemaCXX/cxx2b-deducing-this.cpp | 4 
 3 files changed, 9 insertions(+), 1 deletion(-)

diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 649ad655905af2..213a864d25dcae 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -254,6 +254,8 @@ Bug Fixes to C++ Support
   Fixes (`#68490 `_)
 - Fix a crash when trying to call a varargs function that also has an explicit 
object parameter.
   Fixes (`#80971 ICE when explicit object parameter be a function parameter 
pack`)
+- Reject explicit object parameters on `new` and `delete` operators.
+  Fixes (`#82249 ` _)
 - Fixed a bug where abbreviated function templates would append their invented 
template parameters to
   an empty template parameter lists.
 - Clang now classifies aggregate initialization in C++17 and newer as constant
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp
index 79263bc3ff671d..7c009d9c8ec093 100644
--- a/clang/lib/Sema/SemaDeclCXX.cpp
+++ b/clang/lib/Sema/SemaDeclCXX.cpp
@@ -11395,7 +11395,9 @@ void Sema::CheckExplicitObjectMemberFunction(Declarator 
,
 << ExplicitObjectParam->getSourceRange();
   }
 
-  if (D.getDeclSpec().getStorageClassSpec() == DeclSpec::SCS_static) {
+  if (D.getDeclSpec().getStorageClassSpec() == DeclSpec::SCS_static ||
+  (D.getContext() == clang::DeclaratorContext::Member &&
+   D.isStaticMember())) {
 Diag(ExplicitObjectParam->getBeginLoc(),
  diag::err_explicit_object_parameter_nonmember)
 << D.getSourceRange() << /*static=*/0 << IsLambda;
diff --git a/clang/test/SemaCXX/cxx2b-deducing-this.cpp 
b/clang/test/SemaCXX/cxx2b-deducing-this.cpp
index 30131d6adc4db0..b8ddb9ad300034 100644
--- a/clang/test/SemaCXX/cxx2b-deducing-this.cpp
+++ b/clang/test/SemaCXX/cxx2b-deducing-this.cpp
@@ -16,6 +16,10 @@ struct S {
 static void f(this auto); // expected-error{{an explicit object parameter 
cannot appear in a static function}}
 virtual void f(this S); // expected-error{{an explicit object parameter 
cannot appear in a virtual function}}
 
+// new and delete are implicitly static
+void *operator new(this unsigned long); // expected-error{{an explicit 
object parameter cannot appear in a static function}}
+void operator delete(this void*); // expected-error{{an explicit object 
parameter cannot appear in a static function}}
+
 void g(this auto) const; // expected-error{{explicit object member 
function cannot have 'const' qualifier}}
 void h(this auto) &; // expected-error{{explicit object member function 
cannot have '&' qualifier}}
 void i(this auto) &&; // expected-error{{explicit object member function 
cannot have '&&' qualifier}}

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


[clang] [clang] [SemaCXX] Disallow deducing "this" on operator `new` and `delete` (PR #82251)

2024-02-19 Thread Rajveer Singh Bharadwaj via cfe-commits

https://github.com/Rajveer100 updated 
https://github.com/llvm/llvm-project/pull/82251

>From 8fd5e1bb55a778c778bc8829199318661e4d4573 Mon Sep 17 00:00:00 2001
From: Rajveer 
Date: Mon, 19 Feb 2024 19:29:48 +0530
Subject: [PATCH] [clang] [SemaCXX] Disallow deducing "this" on operator `new`
 and `delete`

Resolves Issue #82249
---
 clang/docs/ReleaseNotes.rst| 2 ++
 clang/lib/Sema/SemaDeclCXX.cpp | 4 +++-
 clang/test/SemaCXX/cxx2b-deducing-this.cpp | 4 
 3 files changed, 9 insertions(+), 1 deletion(-)

diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 649ad655905af2..2c6a3180f818ed 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -254,6 +254,8 @@ Bug Fixes to C++ Support
   Fixes (`#68490 `_)
 - Fix a crash when trying to call a varargs function that also has an explicit 
object parameter.
   Fixes (`#80971 ICE when explicit object parameter be a function parameter 
pack`)
+- Reject explicit object parameters on implicitly static member functions.
+  Fixes (`#82249 ` _)
 - Fixed a bug where abbreviated function templates would append their invented 
template parameters to
   an empty template parameter lists.
 - Clang now classifies aggregate initialization in C++17 and newer as constant
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp
index 79263bc3ff671d..7c009d9c8ec093 100644
--- a/clang/lib/Sema/SemaDeclCXX.cpp
+++ b/clang/lib/Sema/SemaDeclCXX.cpp
@@ -11395,7 +11395,9 @@ void Sema::CheckExplicitObjectMemberFunction(Declarator 
,
 << ExplicitObjectParam->getSourceRange();
   }
 
-  if (D.getDeclSpec().getStorageClassSpec() == DeclSpec::SCS_static) {
+  if (D.getDeclSpec().getStorageClassSpec() == DeclSpec::SCS_static ||
+  (D.getContext() == clang::DeclaratorContext::Member &&
+   D.isStaticMember())) {
 Diag(ExplicitObjectParam->getBeginLoc(),
  diag::err_explicit_object_parameter_nonmember)
 << D.getSourceRange() << /*static=*/0 << IsLambda;
diff --git a/clang/test/SemaCXX/cxx2b-deducing-this.cpp 
b/clang/test/SemaCXX/cxx2b-deducing-this.cpp
index 30131d6adc4db0..b8ddb9ad300034 100644
--- a/clang/test/SemaCXX/cxx2b-deducing-this.cpp
+++ b/clang/test/SemaCXX/cxx2b-deducing-this.cpp
@@ -16,6 +16,10 @@ struct S {
 static void f(this auto); // expected-error{{an explicit object parameter 
cannot appear in a static function}}
 virtual void f(this S); // expected-error{{an explicit object parameter 
cannot appear in a virtual function}}
 
+// new and delete are implicitly static
+void *operator new(this unsigned long); // expected-error{{an explicit 
object parameter cannot appear in a static function}}
+void operator delete(this void*); // expected-error{{an explicit object 
parameter cannot appear in a static function}}
+
 void g(this auto) const; // expected-error{{explicit object member 
function cannot have 'const' qualifier}}
 void h(this auto) &; // expected-error{{explicit object member function 
cannot have '&' qualifier}}
 void i(this auto) &&; // expected-error{{explicit object member function 
cannot have '&&' qualifier}}

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


[clang] [clang] [SemaCXX] Disallow deducing "this" on operator `new` and `delete` (PR #82251)

2024-02-19 Thread Rajveer Singh Bharadwaj via cfe-commits

https://github.com/Rajveer100 created 
https://github.com/llvm/llvm-project/pull/82251

Resolves Issue #82249

As described in the issue, any deallocation function for a `class X` is a 
static member (even if not explicitly declared static).

>From 3ad4e85144739e16be13a4d5641b24d1a7e5b00b Mon Sep 17 00:00:00 2001
From: Rajveer 
Date: Mon, 19 Feb 2024 19:29:48 +0530
Subject: [PATCH] [clang] [SemaCXX] Disallow deducing "this" on operator `new`
 and `delete`

Resolves Issue #82249
---
 clang/lib/Sema/SemaDeclCXX.cpp | 4 +++-
 clang/test/SemaCXX/cxx2b-deducing-this.cpp | 4 
 2 files changed, 7 insertions(+), 1 deletion(-)

diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp
index ab8a967b06a456..7a7b544d82b640 100644
--- a/clang/lib/Sema/SemaDeclCXX.cpp
+++ b/clang/lib/Sema/SemaDeclCXX.cpp
@@ -11391,7 +11391,9 @@ void Sema::CheckExplicitObjectMemberFunction(Declarator 
,
 << ExplicitObjectParam->getSourceRange();
   }
 
-  if (D.getDeclSpec().getStorageClassSpec() == DeclSpec::SCS_static) {
+  if (D.getDeclSpec().getStorageClassSpec() == DeclSpec::SCS_static ||
+  (D.getContext() == clang::DeclaratorContext::Member &&
+   D.isStaticMember())) {
 Diag(ExplicitObjectParam->getBeginLoc(),
  diag::err_explicit_object_parameter_nonmember)
 << D.getSourceRange() << /*static=*/0 << IsLambda;
diff --git a/clang/test/SemaCXX/cxx2b-deducing-this.cpp 
b/clang/test/SemaCXX/cxx2b-deducing-this.cpp
index aab35828096a8e..530f8bf6af1b6b 100644
--- a/clang/test/SemaCXX/cxx2b-deducing-this.cpp
+++ b/clang/test/SemaCXX/cxx2b-deducing-this.cpp
@@ -16,6 +16,10 @@ struct S {
 static void f(this auto); // expected-error{{an explicit object parameter 
cannot appear in a static function}}
 virtual void f(this S); // expected-error{{an explicit object parameter 
cannot appear in a virtual function}}
 
+// new and delete are implicitly static
+void *operator new(this unsigned long); // expected-error{{an explicit 
object parameter cannot appear in a static function}}
+void operator delete(this void*); // expected-error{{an explicit object 
parameter cannot appear in a static function}}
+
 void g(this auto) const; // expected-error{{explicit object member 
function cannot have 'const' qualifier}}
 void h(this auto) &; // expected-error{{explicit object member function 
cannot have '&' qualifier}}
 void i(this auto) &&; // expected-error{{explicit object member function 
cannot have '&&' qualifier}}

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


[clang] [clang] Fix crash when inheriting from a cv-qualified type (PR #70594)

2024-02-10 Thread Rajveer Singh Bharadwaj via cfe-commits

https://github.com/Rajveer100 edited 
https://github.com/llvm/llvm-project/pull/70594
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [clang] Fix clang++ crash on assertions when compiling source (PR #70594)

2024-02-09 Thread Rajveer Singh Bharadwaj via cfe-commits

Rajveer100 wrote:

@shafik 
Could you let me know if there are any more changes that are needed here?

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


[clang] [clang] Clang should detect illegal copy constructor with template class as its parameter (PR #81251)

2024-02-09 Thread Rajveer Singh Bharadwaj via cfe-commits

Rajveer100 wrote:

@cor3ntin @shafik 

I am not quite sure if this is the intended fix, also I will check the few 
other failing tests once the _CI_ completes its job.

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


[clang] [clang] Clang should detect illegal copy constructor with template class as its parameter (PR #81251)

2024-02-09 Thread Rajveer Singh Bharadwaj via cfe-commits

https://github.com/Rajveer100 created 
https://github.com/llvm/llvm-project/pull/81251

Resolves Issue #80963

As described in the snippet of the issue, `A` is correctly detected while 
it fails to reject in other cases.

>From c931dd64e63817619c6b7f649828580b3fb2e6ec Mon Sep 17 00:00:00 2001
From: Rajveer 
Date: Fri, 9 Feb 2024 19:20:39 +0530
Subject: [PATCH] [clang] Clang should detect illegal copy constructor with
 template class as its parameter

Resolves Issue #80963
---
 clang/lib/Sema/SemaDeclCXX.cpp |  2 +-
 clang/test/SemaCXX/GH80963.cpp | 15 +++
 2 files changed, 16 insertions(+), 1 deletion(-)
 create mode 100644 clang/test/SemaCXX/GH80963.cpp

diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp
index ab8a967b06a456..9778679ee40d47 100644
--- a/clang/lib/Sema/SemaDeclCXX.cpp
+++ b/clang/lib/Sema/SemaDeclCXX.cpp
@@ -10918,7 +10918,7 @@ void Sema::CheckConstructor(CXXConstructorDecl 
*Constructor) {
   //   parameters have default arguments.
   if (!Constructor->isInvalidDecl() &&
   Constructor->hasOneParamOrDefaultArgs() &&
-  Constructor->getTemplateSpecializationKind() !=
+  Constructor->getTemplateSpecializationKind() ==
   TSK_ImplicitInstantiation) {
 QualType ParamType = Constructor->getParamDecl(0)->getType();
 QualType ClassTy = Context.getTagDeclType(ClassDecl);
diff --git a/clang/test/SemaCXX/GH80963.cpp b/clang/test/SemaCXX/GH80963.cpp
new file mode 100644
index 00..55779e6ff191b7
--- /dev/null
+++ b/clang/test/SemaCXX/GH80963.cpp
@@ -0,0 +1,15 @@
+// RUN: %clang_cc1 -fsyntax-only -verify %s
+
+template < class T, class V > struct A
+{
+A ();
+A (A &);
+A (A < V,T >);
+// expected-error@-1 {{copy constructor must pass its first argument by 
reference}}
+};
+
+void f ()
+{
+A  (A < int, int >());
+// expected-note@-1 {{in instantiation of template class 'A' 
requested here}}
+}

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


[clang] [clang] Fix clang++ crash on assertions when compiling source (PR #70594)

2024-01-13 Thread Rajveer Singh Bharadwaj via cfe-commits

https://github.com/Rajveer100 updated 
https://github.com/llvm/llvm-project/pull/70594

>From 864bd0ef7b6bbb0bc1502ef5884ae3c261d3b156 Mon Sep 17 00:00:00 2001
From: Rajveer 
Date: Sun, 29 Oct 2023 18:37:17 +0530
Subject: [PATCH] [clang] Fix a crash in debug mode

Resolves Issue #35603

This bug was caused due to the assertions being too strict,
loosened by stripping qualifiers from the base class but not
from the type of the initializer.

Added Release Notes for the same.
---
 clang/docs/ReleaseNotes.rst|  3 +++
 clang/lib/AST/ExprConstant.cpp |  2 +-
 clang/test/Sema/GH35603.cpp| 19 +++
 3 files changed, 23 insertions(+), 1 deletion(-)
 create mode 100644 clang/test/Sema/GH35603.cpp

diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 3cbce1be159437..7183dc447b67fa 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -918,6 +918,9 @@ Bug Fixes to C++ Support
   (`#57410 `_) and
   (`#76604 `_)
 
+- Fix crash when inheriting from a cv-qualified type. Fixes:
+  (`#35603 `_)
+
 Bug Fixes to AST Handling
 ^
 - Fixed an import failure of recursive friend class template.
diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp
index f6aeee1a4e935d..3ad66604255924 100644
--- a/clang/lib/AST/ExprConstant.cpp
+++ b/clang/lib/AST/ExprConstant.cpp
@@ -6417,7 +6417,7 @@ static bool HandleConstructorCall(const Expr *E, const 
LValue ,
   // Non-virtual base classes are initialized in the order in the class
   // definition. We have already checked for virtual base classes.
   assert(!BaseIt->isVirtual() && "virtual base for literal type");
-  assert(Info.Ctx.hasSameType(BaseIt->getType(), BaseType) &&
+  assert(Info.Ctx.hasSameUnqualifiedType(BaseIt->getType(), BaseType) &&
  "base class initializers not in expected order");
   ++BaseIt;
 #endif
diff --git a/clang/test/Sema/GH35603.cpp b/clang/test/Sema/GH35603.cpp
new file mode 100644
index 00..853552108ec2b6
--- /dev/null
+++ b/clang/test/Sema/GH35603.cpp
@@ -0,0 +1,19 @@
+// RUN: %clang_cc1 -fsyntax-only -std=c++11 %s -verify
+// RUN: %clang_cc1 -fsyntax-only -std=c++23 %s -verify
+
+// expected-no-diagnostics
+
+struct A {};
+using CA = const A;
+
+struct S1 : CA {
+  constexpr S1() : CA() {}
+};
+
+struct S2 : A {
+  constexpr S2() : CA() {}
+};
+
+struct S3 : CA {
+  constexpr S3() : A() {}
+};

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


[clang] [clang] Fix clang++ crash on assertions when compiling source (PR #70594)

2024-01-01 Thread Rajveer Singh Bharadwaj via cfe-commits

Rajveer100 wrote:

@cor3ntin 
Could you help me in closing this?

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


[clang] [clang] Fix clang++ crash on assertions when compiling source (PR #70594)

2023-12-06 Thread Rajveer Singh Bharadwaj via cfe-commits

https://github.com/Rajveer100 updated 
https://github.com/llvm/llvm-project/pull/70594

>From 1923c212515033dbb92f09c6d11cd2b679261459 Mon Sep 17 00:00:00 2001
From: Rajveer 
Date: Sun, 29 Oct 2023 18:37:17 +0530
Subject: [PATCH] [clang] Fix a crash in debug mode

Resolves Issue #35603

This bug was caused due to the assertions being too strict,
loosened by stripping qualifiers from the base class but not
from the type of the initializer.

Added Release Notes for the same.
---
 clang/docs/ReleaseNotes.rst|  3 +++
 clang/lib/AST/ExprConstant.cpp |  2 +-
 clang/test/Sema/GH35603.cpp| 19 +++
 3 files changed, 23 insertions(+), 1 deletion(-)
 create mode 100644 clang/test/Sema/GH35603.cpp

diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 2595737e8b3b1..25cdc31b0caa6 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -670,6 +670,9 @@ Bug Fixes to C++ Support
   default initializing a base class in a constant expression context. Fixes:
   (`#69890 `_)
 
+- Fix crash when inheriting from a cv-qualified type. Fixes:
+  (`#35603 `_)
+
 Bug Fixes to AST Handling
 ^
 - Fixed an import failure of recursive friend class template.
diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp
index 5947805f9576f..07f0a12385b46 100644
--- a/clang/lib/AST/ExprConstant.cpp
+++ b/clang/lib/AST/ExprConstant.cpp
@@ -6431,7 +6431,7 @@ static bool HandleConstructorCall(const Expr *E, const 
LValue ,
   // Non-virtual base classes are initialized in the order in the class
   // definition. We have already checked for virtual base classes.
   assert(!BaseIt->isVirtual() && "virtual base for literal type");
-  assert(Info.Ctx.hasSameType(BaseIt->getType(), BaseType) &&
+  assert(Info.Ctx.hasSameUnqualifiedType(BaseIt->getType(), BaseType) &&
  "base class initializers not in expected order");
   ++BaseIt;
 #endif
diff --git a/clang/test/Sema/GH35603.cpp b/clang/test/Sema/GH35603.cpp
new file mode 100644
index 0..853552108ec2b
--- /dev/null
+++ b/clang/test/Sema/GH35603.cpp
@@ -0,0 +1,19 @@
+// RUN: %clang_cc1 -fsyntax-only -std=c++11 %s -verify
+// RUN: %clang_cc1 -fsyntax-only -std=c++23 %s -verify
+
+// expected-no-diagnostics
+
+struct A {};
+using CA = const A;
+
+struct S1 : CA {
+  constexpr S1() : CA() {}
+};
+
+struct S2 : A {
+  constexpr S2() : CA() {}
+};
+
+struct S3 : CA {
+  constexpr S3() : A() {}
+};

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


[clang] [clang] Fix clang++ crash on assertions when compiling source (PR #70594)

2023-12-02 Thread Rajveer Singh Bharadwaj via cfe-commits

Rajveer100 wrote:

@cor3ntin 
Could you describe the format of the `release note` briefly so I can `amend` my 
`commit` accordingly?

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


[clang] [clang] Fix clang++ crash on assertions when compiling source (PR #70594)

2023-12-02 Thread Rajveer Singh Bharadwaj via cfe-commits

https://github.com/Rajveer100 edited 
https://github.com/llvm/llvm-project/pull/70594
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [clang] Fix clang++ crash on assertions when compiling source (PR #70594)

2023-10-31 Thread Rajveer Singh Bharadwaj via cfe-commits

Rajveer100 wrote:

Why are `clang-format` changes showing up for changes not committed by me?

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


[clang] [clang] Fix clang++ crash on assertions when compiling source (PR #70594)

2023-10-31 Thread Rajveer Singh Bharadwaj via cfe-commits


@@ -0,0 +1,19 @@
+// RUN: %clang_cc1 -fsyntax-only -std=c++11 %s -verify
+// RUN: %clang_cc1 -fsyntax-only -std=c++23 %s -verify
+
+// expected-no-diagnostics
+
+struct A {};
+using CA = const A;
+
+struct S1 : CA {

Rajveer100 wrote:

In the `godbolt` links, the compilers seem to be two different versions of 
`clang`, one being a `trunk` and other is an `assertion trunk`?

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


[clang] [clang] Fix clang++ crash on assertions when compiling source (PR #70594)

2023-10-31 Thread Rajveer Singh Bharadwaj via cfe-commits

https://github.com/Rajveer100 updated 
https://github.com/llvm/llvm-project/pull/70594

>From efea75d1ae4a1da80b16b3e743a15a82b5f8d971 Mon Sep 17 00:00:00 2001
From: Rajveer 
Date: Sun, 29 Oct 2023 18:37:17 +0530
Subject: [PATCH] [clang] Fix a crash in debug mode

Resolves Issue #35603

This bug was caused due to the assertions being too strict,
loosened by stripping qualifiers from the base class but not
from the type of the initializer.
---
 clang/lib/AST/ExprConstant.cpp |  2 +-
 clang/test/Sema/GH35603.cpp| 19 +++
 2 files changed, 20 insertions(+), 1 deletion(-)
 create mode 100644 clang/test/Sema/GH35603.cpp

diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp
index 5947805f9576ff8..07f0a12385b46e9 100644
--- a/clang/lib/AST/ExprConstant.cpp
+++ b/clang/lib/AST/ExprConstant.cpp
@@ -6431,7 +6431,7 @@ static bool HandleConstructorCall(const Expr *E, const 
LValue ,
   // Non-virtual base classes are initialized in the order in the class
   // definition. We have already checked for virtual base classes.
   assert(!BaseIt->isVirtual() && "virtual base for literal type");
-  assert(Info.Ctx.hasSameType(BaseIt->getType(), BaseType) &&
+  assert(Info.Ctx.hasSameUnqualifiedType(BaseIt->getType(), BaseType) &&
  "base class initializers not in expected order");
   ++BaseIt;
 #endif
diff --git a/clang/test/Sema/GH35603.cpp b/clang/test/Sema/GH35603.cpp
new file mode 100644
index 000..853552108ec2b67
--- /dev/null
+++ b/clang/test/Sema/GH35603.cpp
@@ -0,0 +1,19 @@
+// RUN: %clang_cc1 -fsyntax-only -std=c++11 %s -verify
+// RUN: %clang_cc1 -fsyntax-only -std=c++23 %s -verify
+
+// expected-no-diagnostics
+
+struct A {};
+using CA = const A;
+
+struct S1 : CA {
+  constexpr S1() : CA() {}
+};
+
+struct S2 : A {
+  constexpr S2() : CA() {}
+};
+
+struct S3 : CA {
+  constexpr S3() : A() {}
+};

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


[clang] [clang] Fix clang++ crash on assertions when compiling source (PR #70594)

2023-10-29 Thread Rajveer Singh Bharadwaj via cfe-commits

https://github.com/Rajveer100 created 
https://github.com/llvm/llvm-project/pull/70594

Resolves Issue #35603

This change makes the `assertion` less strict in `debug` builds by stripping 
qualifiers from the base class and ignoring them. I hope `weakened` assertions 
don't affect other cases where such `errors` are intended to be `caught` by the 
compiler. 

>From 6c5fda81d4d9c5cda677cb84fffaa8bf5c2bb6ac Mon Sep 17 00:00:00 2001
From: Rajveer 
Date: Sun, 29 Oct 2023 18:37:17 +0530
Subject: [PATCH] [clang] Fix clang++ crash on assertions when compiling source

Resolves Issue #35603
---
 clang/lib/AST/ExprConstant.cpp  |  2 +-
 clang/test/Sema/assertion-crash.cpp | 19 +++
 2 files changed, 20 insertions(+), 1 deletion(-)
 create mode 100644 clang/test/Sema/assertion-crash.cpp

diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp
index 5947805f9576ff8..07f0a12385b46e9 100644
--- a/clang/lib/AST/ExprConstant.cpp
+++ b/clang/lib/AST/ExprConstant.cpp
@@ -6431,7 +6431,7 @@ static bool HandleConstructorCall(const Expr *E, const 
LValue ,
   // Non-virtual base classes are initialized in the order in the class
   // definition. We have already checked for virtual base classes.
   assert(!BaseIt->isVirtual() && "virtual base for literal type");
-  assert(Info.Ctx.hasSameType(BaseIt->getType(), BaseType) &&
+  assert(Info.Ctx.hasSameUnqualifiedType(BaseIt->getType(), BaseType) &&
  "base class initializers not in expected order");
   ++BaseIt;
 #endif
diff --git a/clang/test/Sema/assertion-crash.cpp 
b/clang/test/Sema/assertion-crash.cpp
new file mode 100644
index 000..853552108ec2b67
--- /dev/null
+++ b/clang/test/Sema/assertion-crash.cpp
@@ -0,0 +1,19 @@
+// RUN: %clang_cc1 -fsyntax-only -std=c++11 %s -verify
+// RUN: %clang_cc1 -fsyntax-only -std=c++23 %s -verify
+
+// expected-no-diagnostics
+
+struct A {};
+using CA = const A;
+
+struct S1 : CA {
+  constexpr S1() : CA() {}
+};
+
+struct S2 : A {
+  constexpr S2() : CA() {}
+};
+
+struct S3 : CA {
+  constexpr S3() : A() {}
+};

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