This revision was automatically updated to reflect the committed changes. Closed by commit rG74fd474eea53: [clang] Evaluate non-type default template argument when it is required (authored by Fznamznon).
Changed prior to commit: https://reviews.llvm.org/D150108?vs=520325&id=520622#toc Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D150108/new/ https://reviews.llvm.org/D150108 Files: clang/docs/ReleaseNotes.rst clang/lib/Sema/SemaTemplate.cpp clang/test/AST/ast-dump-decl.cpp clang/test/CXX/expr/expr.const/p3-0x.cpp clang/test/Index/Core/index-source.cpp clang/test/SemaCXX/GH62596.cpp clang/test/SemaCXX/cxx2a-consteval-default-params.cpp clang/test/SemaTemplate/deduction-guide.cpp clang/test/SemaTemplate/temp_arg_nontype.cpp clang/unittests/AST/ASTImporterTest.cpp
Index: clang/unittests/AST/ASTImporterTest.cpp =================================================================== --- clang/unittests/AST/ASTImporterTest.cpp +++ clang/unittests/AST/ASTImporterTest.cpp @@ -1156,8 +1156,6 @@ NonTypeTemplateParmDecl *To = Import(From, Lang_CXX03); ASSERT_TRUE(To->hasDefaultArgument()); Stmt *ToArg = To->getDefaultArgument(); - ASSERT_TRUE(isa<ConstantExpr>(ToArg)); - ToArg = *ToArg->child_begin(); ASSERT_TRUE(isa<IntegerLiteral>(ToArg)); ASSERT_EQ(cast<IntegerLiteral>(ToArg)->getValue().getLimitedValue(), 1U); } Index: clang/test/SemaTemplate/temp_arg_nontype.cpp =================================================================== --- clang/test/SemaTemplate/temp_arg_nontype.cpp +++ clang/test/SemaTemplate/temp_arg_nontype.cpp @@ -204,8 +204,8 @@ } namespace PR6964 { - template <typename ,int, int = 9223372036854775807L > // expected-warning 2{{non-type template argument value '9223372036854775807' truncated to '-1' for template parameter of type 'int'}} \ - // expected-note 2{{template parameter is declared here}} + template <typename ,int, int = 9223372036854775807L > // expected-warning {{non-type template argument value '9223372036854775807' truncated to '-1' for template parameter of type 'int'}} \ + // expected-note {{template parameter is declared here}} struct as_nview { }; template <typename Sequence, int I0> Index: clang/test/SemaTemplate/deduction-guide.cpp =================================================================== --- clang/test/SemaTemplate/deduction-guide.cpp +++ clang/test/SemaTemplate/deduction-guide.cpp @@ -224,9 +224,7 @@ // CHECK: |-NonTypeTemplateParmDecl {{.*}} 'char' depth 0 index 0 // CHECK: `-TemplateArgument expr // CHECK: | |-inherited from NonTypeTemplateParm {{.*}} '' 'char' -// CHECK: | `-ConstantExpr {{.*}} 'char' -// CHECK: | |-value: Int 120 -// CHECK: | `-CharacterLiteral {{.*}} 'char' 120 +// CHECK: | `-CharacterLiteral {{.*}} 'char' 120 // CHECK: |-TemplateTypeParmDecl {{.*}} typename depth 0 index 1 U // CHECK: |-ParenExpr {{.*}} 'bool' // CHECK: | `-CXXBoolLiteralExpr {{.*}} 'bool' false Index: clang/test/SemaCXX/cxx2a-consteval-default-params.cpp =================================================================== --- clang/test/SemaCXX/cxx2a-consteval-default-params.cpp +++ clang/test/SemaCXX/cxx2a-consteval-default-params.cpp @@ -79,3 +79,16 @@ }; void f(A a = A()) { } } + +namespace GH62224 { + consteval int fwd(); + template <int i = fwd()> + struct C { + consteval C(int = fwd()) { } + consteval int get() { return i; } + }; + + consteval int fwd() { return 42; } + C<> Val; // No error since fwd is defined already. + static_assert(Val.get() == 42); +} Index: clang/test/SemaCXX/GH62596.cpp =================================================================== --- /dev/null +++ clang/test/SemaCXX/GH62596.cpp @@ -0,0 +1,17 @@ +// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s +// RUN: %clang_cc1 -fsyntax-only -verify -std=c++17 %s +// RUN: %clang_cc1 -fsyntax-only -verify -std=c++20 %s + +struct foo { + static constexpr bool bar() { + return true; + } + + template<bool B = bar()> + static constexpr bool baz() { + return B; + } +}; +static_assert(foo::baz(), ""); + +// expected-no-diagnostics Index: clang/test/Index/Core/index-source.cpp =================================================================== --- clang/test/Index/Core/index-source.cpp +++ clang/test/Index/Core/index-source.cpp @@ -405,7 +405,7 @@ // CHECK: [[@LINE-1]]:23 | class/C++ | Cls | c:@S@Cls | <no-cgname> | Ref,RelCont | rel: 1 // CHECK-NEXT: RelCont | TemplateDefaultValues | c:@ST>3#T#NI#t>1#T@TemplateDefaultValues int x = Record::C, -// CHECK: [[@LINE-1]]:26 | static-property/C++ | C | c:@S@Record@C | __ZN6Record1CE | Ref,Read,RelCont | rel: 1 +// CHECK: [[@LINE-1]]:26 | static-property/C++ | C | c:@S@Record@C | __ZN6Record1CE | Ref,RelCont | rel: 1 // CHECK-NEXT: RelCont | TemplateDefaultValues | c:@ST>3#T#NI#t>1#T@TemplateDefaultValues // CHECK: [[@LINE-3]]:18 | struct/C++ | Record | c:@S@Record | <no-cgname> | Ref,RelCont | rel: 1 template <typename> class Collection = ns2::ACollectionDecl> Index: clang/test/CXX/expr/expr.const/p3-0x.cpp =================================================================== --- clang/test/CXX/expr/expr.const/p3-0x.cpp +++ clang/test/CXX/expr/expr.const/p3-0x.cpp @@ -10,6 +10,7 @@ case nonconst: // expected-error {{case value is not a constant expression}} expected-note {{read of non-const}} break; } + NonConstT<> V; // expected-note {{while checking a default template argument used here}} return; } Index: clang/test/AST/ast-dump-decl.cpp =================================================================== --- clang/test/AST/ast-dump-decl.cpp +++ clang/test/AST/ast-dump-decl.cpp @@ -455,9 +455,7 @@ // CHECK: ClassTemplateDecl 0x{{.+}} <{{.+}}:[[@LINE-148]]:3, col:31> col:31 TestTemplateDefaultNonType // CHECK-NEXT: |-NonTypeTemplateParmDecl 0x{{.+}} <col:12, col:20> col:16 'int' depth 0 index 0 I // CHECK-NEXT: | `-TemplateArgument expr -// CHECK-NEXT: | `-ConstantExpr 0x{{.+}} <col:20> 'int' -// CHECK-NEXT: | |-value: Int 42 -// CHECK-NEXT: | `-IntegerLiteral 0x{{.+}} <col:20> 'int' 42 +// CHECK-NEXT: | `-IntegerLiteral 0x{{.+}} <col:20> 'int' 42 // CHECK-NEXT: `-CXXRecordDecl 0x{{.+}} <col:24, col:31> col:31 struct TestTemplateDefaultNonType // CHECK: ClassTemplateDecl 0x{{.+}} <{{.+}}:{{.*}}:3, col:68> col:68 TestTemplateTemplateDefaultType @@ -661,9 +659,7 @@ // CHECK-NEXT: FunctionTemplateDecl // CHECK-NEXT: NonTypeTemplateParmDecl{{.*}} 'int' depth 0 index 0 I // CHECK-NEXT: TemplateArgument expr -// CHECK-NEXT: ConstantExpr{{.*}} 'int' -// CHECK-NEXT: value: Int 1 -// CHECK-NEXT: IntegerLiteral{{.*}} 'int' 1 +// CHECK-NEXT: IntegerLiteral{{.*}} 'int' 1 // CHECK-NEXT: NonTypeTemplateParmDecl{{.*}} 'int' depth 0 index 1 ... J namespace TestTemplateTemplateParmDecl { Index: clang/lib/Sema/SemaTemplate.cpp =================================================================== --- clang/lib/Sema/SemaTemplate.cpp +++ clang/lib/Sema/SemaTemplate.cpp @@ -1610,16 +1610,6 @@ if (DiagnoseUnexpandedParameterPack(Default, UPPC_DefaultArgument)) return Param; - TemplateArgument SugaredConverted, CanonicalConverted; - ExprResult DefaultRes = CheckTemplateArgument( - Param, Param->getType(), Default, SugaredConverted, CanonicalConverted, - CTAK_Specified); - if (DefaultRes.isInvalid()) { - Param->setInvalidDecl(); - return Param; - } - Default = DefaultRes.get(); - Param->setDefaultArgument(Default); } Index: clang/docs/ReleaseNotes.rst =================================================================== --- clang/docs/ReleaseNotes.rst +++ clang/docs/ReleaseNotes.rst @@ -376,6 +376,10 @@ - Fix crash when attempting to pass a non-pointer type as first argument of ``__builtin_assume_aligned``. (`#62305 <https://github.com/llvm/llvm-project/issues/62305>`_) +- A default argument for a non-type template parameter is evaluated and checked + at the point where it is required. This fixes: + (`#62224 <https://github.com/llvm/llvm-project/issues/62224>`_) and + (`#62596 <https://github.com/llvm/llvm-project/issues/62596>`_) Bug Fixes to Compiler Builtins ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits