2020-01-15 08:48:42 +08:00
|
|
|
// RUN: %clang_cc1 -std=c++2a -fconcepts-ts -x c++ -verify %s
|
|
|
|
|
|
|
|
template<typename T>
|
|
|
|
concept C1 = sizeof(T) == 1;
|
|
|
|
// expected-note@-1 2{{because 'sizeof(short) == 1' (2 == 1) evaluated to false}}
|
|
|
|
// expected-note@-2 {{because 'sizeof(int) == 1' (4 == 1) evaluated to false}}
|
|
|
|
|
|
|
|
template<C1 T> // expected-note {{because 'int' does not satisfy 'C1'}}
|
|
|
|
using A = T;
|
|
|
|
|
|
|
|
using a1 = A<int>; // expected-error {{constraints not satisfied for alias template 'A' [with T = int]}}
|
|
|
|
using a2 = A<char>;
|
|
|
|
|
|
|
|
template<typename T>
|
|
|
|
concept C2 = sizeof(T) == 2;
|
|
|
|
// expected-note@-1 {{because 'sizeof(char) == 2' (1 == 2) evaluated to false}}
|
|
|
|
|
|
|
|
template<C1 T1, C2 T2>
|
|
|
|
// expected-note@-1 2{{because 'short' does not satisfy 'C1'}}
|
|
|
|
// expected-note@-2 {{because 'char' does not satisfy 'C2'}}
|
|
|
|
using B = T1;
|
|
|
|
|
|
|
|
using b1 = B<char, short>;
|
|
|
|
using b2 = B<char, char>; // expected-error {{constraints not satisfied for alias template 'B' [with T1 = char, T2 = char]}}
|
|
|
|
using b3 = B<short, short>; // expected-error {{constraints not satisfied for alias template 'B' [with T1 = short, T2 = short]}}
|
|
|
|
using b4 = B<short, char>; // expected-error {{constraints not satisfied for alias template 'B' [with T1 = short, T2 = char]}}
|
|
|
|
|
|
|
|
template<typename... T>
|
|
|
|
concept C3 = (sizeof(T) + ...) == 12;
|
|
|
|
// expected-note@-1 {{because 'sizeof(char [11]) == 12' (11 == 12) evaluated to false}}
|
|
|
|
// expected-note@-2 {{because 'sizeof(char [10]) == 12' (10 == 12) evaluated to false}}
|
|
|
|
// expected-note@-3 3{{because 'sizeof(int) == 12' (4 == 12) evaluated to false}}
|
|
|
|
// expected-note@-4 6{{because 'sizeof(short) == 12' (2 == 12) evaluated to false}}
|
|
|
|
|
|
|
|
template<C3 T1, C3 T2, C3 T3>
|
|
|
|
// expected-note@-1 {{because 'char [11]' does not satisfy 'C3'}}
|
|
|
|
// expected-note@-2 {{because 'char [10]' does not satisfy 'C3'}}
|
|
|
|
using C = T2;
|
|
|
|
|
|
|
|
using c1 = C<char[12], int[3], short[6]>;
|
|
|
|
using c2 = C<char[12], char[11], char[10]>;
|
|
|
|
// expected-error@-1 {{constraints not satisfied for alias template 'C' [with T1 = char [12], T2 = char [11], T3 = char [10]]}}
|
|
|
|
using c3 = C<char[12], char[12], char[10]>;
|
|
|
|
// expected-error@-1 {{constraints not satisfied for alias template 'C' [with T1 = char [12], T2 = char [12], T3 = char [10]]}}
|
|
|
|
|
|
|
|
template<C3... Ts>
|
|
|
|
// expected-note@-1 {{because 'int' does not satisfy 'C3'}}
|
|
|
|
// expected-note@-2 2{{and 'int' does not satisfy 'C3'}}
|
|
|
|
// expected-note@-3 {{because 'short' does not satisfy 'C3'}}
|
|
|
|
// expected-note@-4 5{{and 'short' does not satisfy 'C3'}}
|
|
|
|
using D = int;
|
|
|
|
|
|
|
|
using d1 = D<char[12], int[3], short[6]>;
|
|
|
|
using d2 = D<int, int, int>;
|
|
|
|
// expected-error@-1 {{constraints not satisfied for alias template 'D' [with Ts = <int, int, int>}}
|
|
|
|
using d3 = D<short, short, short, short, short, short>;
|
|
|
|
// expected-error@-1 {{constraints not satisfied for alias template 'D' [with Ts = <short, short, short, short, short, short>}}
|
|
|
|
|
|
|
|
template<typename T>
|
|
|
|
concept C4 = sizeof(T) == 4;
|
|
|
|
// expected-note@-1 3{{because 'sizeof(char) == 4' (1 == 4) evaluated to false}}
|
|
|
|
|
|
|
|
template<C4... Ts>
|
|
|
|
// expected-note@-1 2{{because 'char' does not satisfy 'C4'}}
|
|
|
|
// expected-note@-2 {{and 'char' does not satisfy 'C4'}}
|
|
|
|
using E = int;
|
|
|
|
|
|
|
|
using e1 = E<int>;
|
|
|
|
using e2 = E<char, int>; // expected-error {{constraints not satisfied for alias template 'E' [with Ts = <char, int>]}}
|
|
|
|
using e3 = E<char, char>; // expected-error {{constraints not satisfied for alias template 'E' [with Ts = <char, char>]}}
|
|
|
|
using e4 = E<>;
|
|
|
|
|
|
|
|
template<typename T, typename U>
|
|
|
|
constexpr bool is_same_v = false;
|
|
|
|
|
|
|
|
template<typename T>
|
|
|
|
constexpr bool is_same_v<T, T> = true;
|
|
|
|
|
|
|
|
template<typename T, typename U>
|
|
|
|
concept Same = is_same_v<T, U>; // expected-note {{because 'is_same_v<long, int>' evaluated to false}}
|
|
|
|
|
|
|
|
template<Same<int> T> // expected-note {{because 'Same<long, int>' evaluated to false}}
|
|
|
|
using F = T;
|
|
|
|
|
|
|
|
using f1 = F<int>;
|
|
|
|
using f2 = F<long>; // expected-error {{constraints not satisfied for alias template 'F' [with T = long]}}
|
|
|
|
|
|
|
|
template<typename T, typename... Ts>
|
|
|
|
concept OneOf = (is_same_v<T, Ts> || ...);
|
|
|
|
// expected-note@-1 2{{because 'is_same_v<char, char [1]>' evaluated to false}}
|
|
|
|
// expected-note@-2 2{{and 'is_same_v<char, char [2]>' evaluated to false}}
|
|
|
|
// expected-note@-3 {{because 'is_same_v<short, int>' evaluated to false}}
|
|
|
|
// expected-note@-4 {{and 'is_same_v<short, long>' evaluated to false}}
|
|
|
|
// expected-note@-5 {{and 'is_same_v<short, char>' evaluated to false}}
|
|
|
|
// expected-note@-6 3{{because 'is_same_v<int, char [1]>' evaluated to false}}
|
|
|
|
// expected-note@-7 3{{and 'is_same_v<int, char [2]>' evaluated to false}}
|
|
|
|
|
|
|
|
template<OneOf<char[1], char[2]> T, OneOf<int, long, char> U>
|
|
|
|
// expected-note@-1 2{{because 'OneOf<char, char [1], char [2]>' evaluated to false}}
|
|
|
|
// expected-note@-2 {{because 'OneOf<short, int, long, char>' evaluated to false}}
|
|
|
|
using G = T;
|
|
|
|
|
|
|
|
using g1 = G<char[1], int>;
|
|
|
|
using g2 = G<char, int>; // expected-error{{constraints not satisfied for alias template 'G' [with T = char, U = int]}}
|
|
|
|
using g3 = G<char[1], short>; // expected-error{{constraints not satisfied for alias template 'G' [with T = char [1], U = short]}}
|
|
|
|
using g4 = G<char, short>; // expected-error{{constraints not satisfied for alias template 'G' [with T = char, U = short]}}
|
|
|
|
|
|
|
|
template<OneOf<char[1], char[2]>... Ts>
|
|
|
|
// expected-note@-1 2{{because 'OneOf<int, char [1], char [2]>' evaluated to false}}
|
|
|
|
// expected-note@-2 {{and 'OneOf<int, char [1], char [2]>' evaluated to false}}
|
|
|
|
using H = int;
|
|
|
|
|
|
|
|
using h1 = H<char[1], int>;
|
|
|
|
// expected-error@-1 {{constraints not satisfied for alias template 'H' [with Ts = <char [1], int>]}}
|
|
|
|
using h2 = H<int, int>;
|
|
|
|
// expected-error@-1 {{constraints not satisfied for alias template 'H' [with Ts = <int, int>]}}
|
Revert "[Concepts] Placeholder constraints and abbreviated templates"
This reverts commit e57a9abc4b01fa69fe81ace8df70517983b6cbac.
Parser/cxx2a-placeholder-type-constraint.cpp has MSan failures.
Present at 7b81c3f8793d30a4285095a9b67dcfca2117916c:
http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-bootstrap-msan/builds/17133/steps/check-clang%20msan/logs/stdio
not present at eaa594f4ec54eba52b03fd9f1c789b214c66a753:
http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-bootstrap-msan/builds/17132/steps/check-clang%20msan/logs/stdio
Stack trace:
```
==57032==WARNING: MemorySanitizer: use-of-uninitialized-value
#0 0xccfe016 in clang::AutoTypeLoc::getLocalSourceRange() const /b/sanitizer-x86_64-linux-bootstrap-msan/build/llvm-project/clang/include/clang/AST/TypeLoc.h:2036:19
#1 0xcc56758 in CheckDeducedPlaceholderConstraints(clang::Sema&, clang::AutoType const&, clang::AutoTypeLoc, clang::QualType) /b/sanitizer-x86_64-linux-bootstrap-msan/build/llvm-project/clang/lib/Sema/SemaTemplateDeduction.cpp:4505:56
#2 0xcc550ce in clang::Sema::DeduceAutoType(clang::TypeLoc, clang::Expr*&, clang::QualType&, llvm::Optional<unsigned int>, bool) /b/sanitizer-x86_64-linux-bootstrap-msan/build/llvm-project/clang/lib/Sema/SemaTemplateDeduction.cpp:4707:11
#3 0xcc52407 in clang::Sema::DeduceAutoType(clang::TypeSourceInfo*, clang::Expr*&, clang::QualType&, llvm::Optional<unsigned int>, bool) /b/sanitizer-x86_64-linux-bootstrap-msan/build/llvm-project/clang/lib/Sema/SemaTemplateDeduction.cpp:4457:10
#4 0xba38332 in clang::Sema::deduceVarTypeFromInitializer(clang::VarDecl*, clang::DeclarationName, clang::QualType, clang::TypeSourceInfo*, clang::SourceRange, bool, clang::Expr*) /b/sanitizer-x86_64-linux-bootstrap-msan/build/llvm-project/clang/lib/Sema/SemaDecl.cpp:11351:7
#5 0xba3a8a9 in clang::Sema::DeduceVariableDeclarationType(clang::VarDecl*, bool, clang::Expr*) /b/sanitizer-x86_64-linux-bootstrap-msan/build/llvm-project/clang/lib/Sema/SemaDecl.cpp:11385:26
#6 0xba3c520 in clang::Sema::AddInitializerToDecl(clang::Decl*, clang::Expr*, bool) /b/sanitizer-x86_64-linux-bootstrap-msan/build/llvm-project/clang/lib/Sema/SemaDecl.cpp:11725:9
#7 0xb39c498 in clang::Parser::ParseDeclarationAfterDeclaratorAndAttributes(clang::Declarator&, clang::Parser::ParsedTemplateInfo const&, clang::Parser::ForRangeInit*) /b/sanitizer-x86_64-linux-bootstrap-msan/build/llvm-project/clang/lib/Parse/ParseDecl.cpp:2399:17
#8 0xb394d80 in clang::Parser::ParseDeclGroup(clang::ParsingDeclSpec&, clang::DeclaratorContext, clang::SourceLocation*, clang::Parser::ForRangeInit*) /b/sanitizer-x86_64-linux-bootstrap-msan/build/llvm-project/clang/lib/Parse/ParseDecl.cpp:2128:21
#9 0xb383bbf in clang::Parser::ParseSimpleDeclaration(clang::DeclaratorContext, clang::SourceLocation&, clang::Parser::ParsedAttributesWithRange&, bool, clang::Parser::ForRangeInit*, clang::SourceLocation*) /b/sanitizer-x86_64-linux-bootstrap-msan/build/llvm-project/clang/lib/Parse/ParseDecl.cpp:1848:10
#10 0xb383129 in clang::Parser::ParseDeclaration(clang::DeclaratorContext, clang::SourceLocation&, clang::Parser::ParsedAttributesWithRange&, clang::SourceLocation*) /b/sanitizer-x86_64-linux-bootstrap-msan/build/llvm-project/llvm/include/llvm/ADT/PointerUnion.h
#11 0xb53a388 in clang::Parser::ParseStatementOrDeclarationAfterAttributes(llvm::SmallVector<clang::Stmt*, 32u>&, clang::Parser::ParsedStmtContext, clang::SourceLocation*, clang::Parser::ParsedAttributesWithRange&) /b/sanitizer-x86_64-linux-bootstrap-msan/build/llvm-project/clang/lib/Parse/ParseStmt.cpp:221:13
#12 0xb539309 in clang::Parser::ParseStatementOrDeclaration(llvm::SmallVector<clang::Stmt*, 32u>&, clang::Parser::ParsedStmtContext, clang::SourceLocation*) /b/sanitizer-x86_64-linux-bootstrap-msan/build/llvm-project/clang/lib/Parse/ParseStmt.cpp:106:20
#13 0xb55610e in clang::Parser::ParseCompoundStatementBody(bool) /b/sanitizer-x86_64-linux-bootstrap-msan/build/llvm-project/clang/lib/Parse/ParseStmt.cpp:1079:11
#14 0xb559529 in clang::Parser::ParseFunctionStatementBody(clang::Decl*, clang::Parser::ParseScope&) /b/sanitizer-x86_64-linux-bootstrap-msan/build/llvm-project/clang/lib/Parse/ParseStmt.cpp:2204:21
#15 0xb33c13e in clang::Parser::ParseFunctionDefinition(clang::ParsingDeclarator&, clang::Parser::ParsedTemplateInfo const&, clang::Parser::LateParsedAttrList*) /b/sanitizer-x86_64-linux-bootstrap-msan/build/llvm-project/clang/lib/Parse/Parser.cpp:1339:10
#16 0xb394703 in clang::Parser::ParseDeclGroup(clang::ParsingDeclSpec&, clang::DeclaratorContext, clang::SourceLocation*, clang::Parser::ForRangeInit*) /b/sanitizer-x86_64-linux-bootstrap-msan/build/llvm-project/clang/lib/Parse/ParseDecl.cpp:2068:11
#17 0xb338e52 in clang::Parser::ParseDeclOrFunctionDefInternal(clang::Parser::ParsedAttributesWithRange&, clang::ParsingDeclSpec&, clang::AccessSpecifier) /b/sanitizer-x86_64-linux-bootstrap-msan/build/llvm-project/clang/lib/Parse/Parser.cpp:1099:10
#18 0xb337674 in clang::Parser::ParseDeclarationOrFunctionDefinition(clang::Parser::ParsedAttributesWithRange&, clang::ParsingDeclSpec*, clang::AccessSpecifier) /b/sanitizer-x86_64-linux-bootstrap-msan/build/llvm-project/clang/lib/Parse/Parser.cpp:1115:12
#19 0xb334a96 in clang::Parser::ParseExternalDeclaration(clang::Parser::ParsedAttributesWithRange&, clang::ParsingDeclSpec*) /b/sanitizer-x86_64-linux-bootstrap-msan/build/llvm-project/clang/lib/Parse/Parser.cpp:935:12
#20 0xb32f12a in clang::Parser::ParseTopLevelDecl(clang::OpaquePtr<clang::DeclGroupRef>&, bool) /b/sanitizer-x86_64-linux-bootstrap-msan/build/llvm-project/clang/lib/Parse/Parser.cpp:686:12
#21 0xb31e193 in clang::ParseAST(clang::Sema&, bool, bool) /b/sanitizer-x86_64-linux-bootstrap-msan/build/llvm-project/clang/lib/Parse/ParseAST.cpp:158:20
#22 0x80263f0 in clang::FrontendAction::Execute() /b/sanitizer-x86_64-linux-bootstrap-msan/build/llvm-project/clang/lib/Frontend/FrontendAction.cpp:936:8
#23 0x7f2a257 in clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) /b/sanitizer-x86_64-linux-bootstrap-msan/build/llvm-project/clang/lib/Frontend/CompilerInstance.cpp:965:33
#24 0x8288bef in clang::ExecuteCompilerInvocation(clang::CompilerInstance*) /b/sanitizer-x86_64-linux-bootstrap-msan/build/llvm-project/clang/lib/FrontendTool/ExecuteCompilerInvocation.cpp:290:25
#25 0xad44c2 in cc1_main(llvm::ArrayRef<char const*>, char const*, void*) /b/sanitizer-x86_64-linux-bootstrap-msan/build/llvm-project/clang/tools/driver/cc1_main.cpp:239:15
#26 0xacd76a in ExecuteCC1Tool(llvm::ArrayRef<char const*>) /b/sanitizer-x86_64-linux-bootstrap-msan/build/llvm-project/clang/tools/driver/driver.cpp:325:12
#27 0xacc9fd in main /b/sanitizer-x86_64-linux-bootstrap-msan/build/llvm-project/clang/tools/driver/driver.cpp:398:12
#28 0x7f7d82cdb2e0 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x202e0)
#29 0xa4dde9 in _start (/b/sanitizer-x86_64-linux-bootstrap-msan/build/llvm_build_msan/bin/clang-11+0xa4dde9)
```
2020-01-23 17:38:59 +08:00
|
|
|
using h3 = H<char[1], char[2]>;
|