Files
RedBear-OS/local/recipes/dev/libclc/source/clang/test/Parser/cxx2a-concept-declaration.cpp
T
vasilito cb424d7448 build: static patch-sanity linter (shift-left the malformed-patch class)
verify-patch-sanity.py validates every active recipe .patch has internally-
consistent hunk line counts — catching the 'malformed patch at line N' failure
at commit/CI/preflight time instead of hours into a cook. This cycle hit that
class three times (qtwaylandscanner, sddm, xwayland), each only discovered when
cookbook tried to apply the patch.

Running it across the repo found 29 latent malformed patches (validated against
GNU patch: e.g. relibc/P3-sysv-ipc reproduces 'malformed patch at line 22').
They were harmless only because they sit in vendored recipes (baked, not re-
applied) — but would fail on any version-bump re-derivation. --fix recounts the
hunk headers (body untouched) and repaired all 29.

Wired into build-preflight.sh (Phase 1.0D) and redbear-ci.yml, with a unit test
(test-patch-sanity.sh). Skips archived/legacy trees and unvalidatable formats
(empty placeholders, bare-@@ git hunks).
2026-08-01 05:13:02 +03:00

101 lines
4.4 KiB
C++

// Support parsing of concepts
// RUN: %clang_cc1 -std=c++20 -verify %s
template<typename T> concept C1 = true; // expected-note 2{{previous}}
template<typename T> concept C1 = true; // expected-error{{redefinition}}
template<concept T> concept D1 = true;
// expected-error@-1{{expected template parameter}}
// expected-error@-2{{concept template parameter list must have at least one parameter; explicit specialization of concepts is not allowed}}
template<template<typename> concept T> concept D2 = true;
// expected-error@-1{{expected identifier}}
// expected-error@-2{{template template parameter requires 'class' or 'typename' after the parameter list}}
// expected-error@-3{{concept template parameter list must have at least one parameter; explicit specialization of concepts is not allowed}}
struct S1 {
template<typename T> concept C1 = true; // expected-error {{concept declarations may only appear in global or namespace scope}}
};
extern "C++" {
template<typename T> concept C1 = true; // expected-error{{redefinition}}
}
template<typename A>
template<typename B>
concept C2 = true; // expected-error {{extraneous template parameter list in concept definition}}
template<typename T> concept C3 = true; // expected-note {{previous}} expected-note {{previous}}
int C3; // expected-error {{redefinition}}
struct C3 {}; // expected-error {{redefinition}}
struct C4 {}; // expected-note{{previous definition is here}}
template<typename T> concept C4 = true;
// expected-error@-1{{redefinition of 'C4' as different kind of symbol}}
// TODO: Add test to prevent explicit specialization, partial specialization
// and explicit instantiation of concepts.
template<typename T, T v>
struct integral_constant { static constexpr T value = v; };
namespace N {
template<typename T> concept C5 = true;
}
using N::C5;
template <bool word> concept C6 = integral_constant<bool, wor>::value;
// expected-error@-1{{use of undeclared identifier 'wor'; did you mean 'word'?}}
// expected-note@-2{{'word' declared here}}
template<typename T> concept bool C7 = true;
// expected-error@-1{{ISO C++ does not permit the 'bool' keyword after 'concept'}}
template<> concept C8 = false;
// expected-error@-1{{concept template parameter list must have at least one parameter; explicit specialization of concepts is not allowed}}
template<> concept C7<int> = false;
// expected-error@-1{{name defined in concept definition must be an identifier}}
template<typename T> concept N::C9 = false;
// expected-error@-1{{name defined in concept definition must be an identifier}}
class A { };
// expected-note@-1{{'A' declared here}}
template<typename T> concept A::C10 = false;
// expected-error@-1{{expected namespace name}}
template<typename T> concept operator int = false;
// expected-error@-1{{name defined in concept definition must be an identifier}}
template<bool x> concept C11 = 2; // expected-error {{atomic constraint must be of type 'bool' (found 'int')}}
template<bool x> concept C12 = 2 && x; // expected-error {{atomic constraint must be of type 'bool' (found 'int')}}
template<bool x> concept C13 = x || 2 || x; // expected-error {{atomic constraint must be of type 'bool' (found 'int')}}
template<bool x> concept C14 = 8ull && x || x; // expected-error {{atomic constraint must be of type 'bool' (found 'unsigned long long')}}
template<typename T> concept C15 = sizeof(T); // expected-error {{atomic constraint must be of type 'bool'}}
template<typename T> concept C16 = true && (0 && 0); // expected-error {{atomic constraint must be of type 'bool' (found 'int')}}
// expected-warning@-1{{use of logical '&&' with constant operand}}
// expected-note@-2{{use '&' for a bitwise operation}}
// expected-note@-3{{remove constant to silence this warning}}
template<typename T> concept C17 = T{};
static_assert(!C17<bool>);
template<typename T> concept C18 = (bool&&)true;
static_assert(C18<int>);
template<typename T> concept C19 = (const bool&)true;
static_assert(C19<int>);
template<typename T> concept C20 = (const bool)true;
static_assert(C20<int>);
template <bool c> concept C21 = integral_constant<bool, c>::value && true;
static_assert(C21<true>);
static_assert(!C21<false>);
template <bool c> concept C22 = integral_constant<bool, c>::value;
static_assert(C22<true>);
static_assert(!C22<false>);
template <bool word> concept C23 = integral_constant<bool, wor>::value;
// expected-error@-1{{use of undeclared identifier 'wor'; did you mean 'word'?}}
// expected-note@-2{{'word' declared here}}