[clang] 13acb3a - [clang][Interp] Don't diagnose alread invalid function decls

Timm Bäder via cfe-commits cfe-commits at lists.llvm.org
Fri Feb 23 01:53:42 PST 2024


Author: Timm Bäder
Date: 2024-02-23T10:53:31+01:00
New Revision: 13acb3af5ad48e850cf37dcf02270ede3f267bd4

URL: https://github.com/llvm/llvm-project/commit/13acb3af5ad48e850cf37dcf02270ede3f267bd4
DIFF: https://github.com/llvm/llvm-project/commit/13acb3af5ad48e850cf37dcf02270ede3f267bd4.diff

LOG: [clang][Interp] Don't diagnose alread invalid function decls

They have already been diagnosed before. Also improve that test case.

Added: 
    

Modified: 
    clang/lib/AST/Interp/Interp.cpp
    clang/test/SemaCXX/PR68542.cpp

Removed: 
    


################################################################################
diff  --git a/clang/lib/AST/Interp/Interp.cpp b/clang/lib/AST/Interp/Interp.cpp
index 82bc1f240cc51c..b2fe70dc14f9d5 100644
--- a/clang/lib/AST/Interp/Interp.cpp
+++ b/clang/lib/AST/Interp/Interp.cpp
@@ -462,6 +462,10 @@ bool CheckCallable(InterpState &S, CodePtr OpPC, const Function *F) {
     if (S.getLangOpts().CPlusPlus11) {
       const FunctionDecl *DiagDecl = F->getDecl();
 
+      // Invalid decls have been diagnosed before.
+      if (DiagDecl->isInvalidDecl())
+        return false;
+
       // If this function is not constexpr because it is an inherited
       // non-constexpr constructor, diagnose that directly.
       const auto *CD = dyn_cast<CXXConstructorDecl>(DiagDecl);

diff  --git a/clang/test/SemaCXX/PR68542.cpp b/clang/test/SemaCXX/PR68542.cpp
index fc767a78c8b001..e266bf9ba77ab2 100644
--- a/clang/test/SemaCXX/PR68542.cpp
+++ b/clang/test/SemaCXX/PR68542.cpp
@@ -1,20 +1,20 @@
 // RUN: %clang_cc1 -verify -std=c++20 -fsyntax-only %s
+// RUN: %clang_cc1 -verify -std=c++20 -fsyntax-only %s -fexperimental-new-constant-interpreter
 
-struct S {
+struct S { // expected-note {{candidate constructor (the implicit move constructor) not viable: no known conversion from 'int' to 'S &&' for 1st argument}} \
+           // expected-note {{candidate constructor (the implicit copy constructor) not viable: no known conversion from 'int' to 'const S &' for 1st argument}}
     int e;
 };
 
 template<class T>
 consteval int get_format() {
-	return nullptr; // expected-error{{cannot initialize return object of type 'int' with an rvalue of type 'std::nullptr_t'}}
+	return nullptr; // expected-error {{cannot initialize return object of type 'int' with an rvalue of type 'std::nullptr_t'}}
 }
 
 template<class T>
 constexpr S f(T) noexcept {
-	return get_format<T>(); // expected-error{{no viable conversion from returned value of type 'int' to function return type 'S'}}
+	return get_format<T>(); // expected-error {{no viable conversion from returned value of type 'int' to function return type 'S'}}
 }
 
-constexpr S x = f(0); // expected-error{{constexpr variable 'x' must be initialized by a constant expression}}
-// expected-note at -1{{in instantiation of function template specialization 'f<int>' requested here}}
-// expected-note at 3{{candidate constructor (the implicit move constructor) not viable: no known conversion from 'int' to 'S &&' for 1st argument}}
-// expected-note at 3{{candidate constructor (the implicit copy constructor) not viable: no known conversion from 'int' to 'const S &' for 1st argument}}
+constexpr S x = f(0); // expected-error {{constexpr variable 'x' must be initialized by a constant expression}} \
+                      // expected-note {{in instantiation of function template specialization 'f<int>' requested here}}


        


More information about the cfe-commits mailing list