|
10 | 10 | // |
11 | 11 | //===----------------------------------------------------------------------===// |
12 | 12 |
|
| 13 | +#include "clang/AST/ExprConcepts.h" |
13 | 14 | #include "clang/AST/RecordLayout.h" |
14 | 15 | #include "clang/ASTMatchers/ASTMatchers.h" |
15 | 16 | #include "clang/Testing/CommandLineArgs.h" |
@@ -3217,6 +3218,102 @@ TEST_P(ImportExpr, UnresolvedMemberExpr) { |
3217 | 3218 | compoundStmt(has(callExpr(has(unresolvedMemberExpr()))))))))); |
3218 | 3219 | } |
3219 | 3220 |
|
| 3221 | +TEST_P(ImportExpr, ConceptNoRequirement) { |
| 3222 | + MatchVerifier<Decl> Verifier; |
| 3223 | + const char *Code = R"( |
| 3224 | + template<typename T> |
| 3225 | + struct is_int { static const bool value = false; }; |
| 3226 | + template<> struct is_int<int> { static const bool value = true; }; |
| 3227 | + template<typename T> |
| 3228 | + concept declToImport = is_int<T>::value; |
| 3229 | + )"; |
| 3230 | + testImport(Code, Lang_CXX20, "", Lang_CXX20, Verifier, |
| 3231 | + conceptDecl(unless(has(requiresExpr())))); |
| 3232 | +} |
| 3233 | + |
| 3234 | +TEST_P(ImportExpr, ConceptSimpleRequirement) { |
| 3235 | + MatchVerifier<Decl> Verifier; |
| 3236 | + const char *Code = R"( |
| 3237 | + template <class T1, class T2> |
| 3238 | + concept declToImport = requires(T1 i, T2 j) { |
| 3239 | + i + j; |
| 3240 | + }; |
| 3241 | + )"; |
| 3242 | + testImport(Code, Lang_CXX20, "", Lang_CXX20, Verifier, |
| 3243 | + conceptDecl(has(requiresExpr(has(requiresExprBodyDecl()))))); |
| 3244 | +} |
| 3245 | + |
| 3246 | +TEST_P(ImportExpr, ConceptCompoundNonTypeRequirement) { |
| 3247 | + MatchVerifier<Decl> Verifier; |
| 3248 | + const char *Code = R"( |
| 3249 | + template <class T1, class T2> |
| 3250 | + concept declToImport = requires(T1 i, T2 j) { |
| 3251 | + {i + j}; |
| 3252 | + }; |
| 3253 | + )"; |
| 3254 | + testImport(Code, Lang_CXX20, "", Lang_CXX20, Verifier, |
| 3255 | + conceptDecl(has(requiresExpr(has(requiresExprBodyDecl()))))); |
| 3256 | +} |
| 3257 | + |
| 3258 | +TEST_P(ImportExpr, ConceptCompoundTypeRequirement) { |
| 3259 | + MatchVerifier<Decl> Verifier; |
| 3260 | + const char *Code = R"( |
| 3261 | + template<typename T> |
| 3262 | + struct is_int { static const bool value = false; }; |
| 3263 | + template<> struct is_int<int> { static const bool value = true; }; |
| 3264 | +
|
| 3265 | + template<typename T> |
| 3266 | + concept type_is_int = is_int<T>::value; |
| 3267 | +
|
| 3268 | + template<typename T> |
| 3269 | + concept declToImport = requires(T x) { |
| 3270 | + {x * 1} -> type_is_int; |
| 3271 | + }; |
| 3272 | + )"; |
| 3273 | + testImport(Code, Lang_CXX20, "", Lang_CXX20, Verifier, |
| 3274 | + conceptDecl(has(requiresExpr(has(requiresExprBodyDecl()))))); |
| 3275 | +} |
| 3276 | + |
| 3277 | +TEST_P(ImportExpr, ConceptTypeRequirement) { |
| 3278 | + MatchVerifier<Decl> Verifier; |
| 3279 | + const char *Code = R"( |
| 3280 | + template <class T> |
| 3281 | + concept declToImport = requires { |
| 3282 | + typename T::value; |
| 3283 | + }; |
| 3284 | + )"; |
| 3285 | + testImport(Code, Lang_CXX20, "", Lang_CXX20, Verifier, |
| 3286 | + conceptDecl(has(requiresExpr(has(requiresExprBodyDecl()))))); |
| 3287 | +} |
| 3288 | + |
| 3289 | +TEST_P(ImportExpr, ConceptNestedRequirement) { |
| 3290 | + MatchVerifier<Decl> Verifier; |
| 3291 | + const char *Code = R"( |
| 3292 | + template<typename T> |
| 3293 | + struct is_int { static const bool value = false; }; |
| 3294 | + template<> struct is_int<int> { static const bool value = true; }; |
| 3295 | +
|
| 3296 | + template<typename T> |
| 3297 | + concept declToImport = requires(T x) { |
| 3298 | + requires is_int<T>::value; |
| 3299 | + }; |
| 3300 | + )"; |
| 3301 | + testImport(Code, Lang_CXX20, "", Lang_CXX20, Verifier, |
| 3302 | + conceptDecl(has(requiresExpr(has(requiresExprBodyDecl()))))); |
| 3303 | +} |
| 3304 | + |
| 3305 | +TEST_P(ImportExpr, ConceptNestedNonInstantiationDependentRequirement) { |
| 3306 | + MatchVerifier<Decl> Verifier; |
| 3307 | + const char *Code = R"( |
| 3308 | + template<typename T> |
| 3309 | + concept declToImport = requires { |
| 3310 | + requires sizeof(long) == sizeof(int); |
| 3311 | + }; |
| 3312 | + )"; |
| 3313 | + testImport(Code, Lang_CXX20, "", Lang_CXX20, Verifier, |
| 3314 | + conceptDecl(has(requiresExpr(has(requiresExprBodyDecl()))))); |
| 3315 | +} |
| 3316 | + |
3220 | 3317 | class ImportImplicitMethods : public ASTImporterOptionSpecificTestBase { |
3221 | 3318 | public: |
3222 | 3319 | static constexpr auto DefaultCode = R"( |
|
0 commit comments