1 //===- unittests/AST/SizelessTypesTest.cpp --- Sizeless type tests --------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // This file contains tests for clang::Type queries related to sizeless types.
10 //
11 //===----------------------------------------------------------------------===//
12 
13 #include "clang/AST/ASTContext.h"
14 #include "clang/AST/Type.h"
15 #include "clang/Tooling/Tooling.h"
16 #include "gtest/gtest.h"
17 
18 using namespace clang;
19 
20 struct SizelessTypeTester : public ::testing::Test {
21   // Declare an incomplete structure type.
22   std::unique_ptr<ASTUnit> AST = tooling::buildASTFromCodeWithArgs(
23       "struct foo;", {"-target", "aarch64-linux-gnu"});
24   ASTContext &Ctx = AST->getASTContext();
25   TranslationUnitDecl &TU = *Ctx.getTranslationUnitDecl();
26   TypeDecl *Foo = cast<TypeDecl>(TU.lookup(&Ctx.Idents.get("foo")).front());
27   const Type *FooTy = Foo->getTypeForDecl();
28 };
29 
TEST_F(SizelessTypeTester,TestSizelessBuiltin)30 TEST_F(SizelessTypeTester, TestSizelessBuiltin) {
31   ASSERT_TRUE(Ctx.SveInt8Ty->isSizelessBuiltinType());
32   ASSERT_TRUE(Ctx.SveInt16Ty->isSizelessBuiltinType());
33   ASSERT_TRUE(Ctx.SveInt32Ty->isSizelessBuiltinType());
34   ASSERT_TRUE(Ctx.SveInt64Ty->isSizelessBuiltinType());
35 
36   ASSERT_TRUE(Ctx.SveUint8Ty->isSizelessBuiltinType());
37   ASSERT_TRUE(Ctx.SveUint16Ty->isSizelessBuiltinType());
38   ASSERT_TRUE(Ctx.SveUint32Ty->isSizelessBuiltinType());
39   ASSERT_TRUE(Ctx.SveUint64Ty->isSizelessBuiltinType());
40 
41   ASSERT_TRUE(Ctx.SveFloat16Ty->isSizelessBuiltinType());
42   ASSERT_TRUE(Ctx.SveFloat32Ty->isSizelessBuiltinType());
43   ASSERT_TRUE(Ctx.SveFloat64Ty->isSizelessBuiltinType());
44 
45   ASSERT_TRUE(Ctx.SveBFloat16Ty->isSizelessBuiltinType());
46 
47   ASSERT_TRUE(Ctx.SveBoolTy->isSizelessBuiltinType());
48 
49   ASSERT_FALSE(Ctx.VoidTy->isSizelessBuiltinType());
50   ASSERT_FALSE(Ctx.PseudoObjectTy->isSizelessBuiltinType());
51   ASSERT_FALSE(FooTy->isSizelessBuiltinType());
52 
53   ASSERT_FALSE(Ctx.getPointerType(Ctx.SveBoolTy)->isSizelessBuiltinType());
54   ASSERT_FALSE(
55       Ctx.getLValueReferenceType(Ctx.SveBoolTy)->isSizelessBuiltinType());
56   ASSERT_FALSE(
57       Ctx.getRValueReferenceType(Ctx.SveBoolTy)->isSizelessBuiltinType());
58 }
59 
TEST_F(SizelessTypeTester,TestSizeless)60 TEST_F(SizelessTypeTester, TestSizeless) {
61   ASSERT_TRUE(Ctx.SveInt8Ty->isSizelessType());
62   ASSERT_TRUE(Ctx.SveInt16Ty->isSizelessType());
63   ASSERT_TRUE(Ctx.SveInt32Ty->isSizelessType());
64   ASSERT_TRUE(Ctx.SveInt64Ty->isSizelessType());
65 
66   ASSERT_TRUE(Ctx.SveUint8Ty->isSizelessType());
67   ASSERT_TRUE(Ctx.SveUint16Ty->isSizelessType());
68   ASSERT_TRUE(Ctx.SveUint32Ty->isSizelessType());
69   ASSERT_TRUE(Ctx.SveUint64Ty->isSizelessType());
70 
71   ASSERT_TRUE(Ctx.SveFloat16Ty->isSizelessType());
72   ASSERT_TRUE(Ctx.SveFloat32Ty->isSizelessType());
73   ASSERT_TRUE(Ctx.SveFloat64Ty->isSizelessType());
74 
75   ASSERT_TRUE(Ctx.SveBFloat16Ty->isSizelessType());
76 
77   ASSERT_TRUE(Ctx.SveBoolTy->isSizelessType());
78 
79   ASSERT_FALSE(Ctx.VoidTy->isSizelessType());
80   ASSERT_FALSE(Ctx.PseudoObjectTy->isSizelessType());
81   ASSERT_FALSE(FooTy->isSizelessType());
82 
83   ASSERT_FALSE(Ctx.getPointerType(Ctx.SveBoolTy)->isSizelessType());
84   ASSERT_FALSE(Ctx.getLValueReferenceType(Ctx.SveBoolTy)->isSizelessType());
85   ASSERT_FALSE(Ctx.getRValueReferenceType(Ctx.SveBoolTy)->isSizelessType());
86 }
87