xref: /aosp_15_r20/external/clang/unittests/Lex/PPCallbacksTest.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li //===- unittests/Lex/PPCallbacksTest.cpp - PPCallbacks tests ------===//
2*67e74705SXin Li //
3*67e74705SXin Li //                     The LLVM Compiler Infrastructure
4*67e74705SXin Li //
5*67e74705SXin Li // This file is distributed under the University of Illinois Open Source
6*67e74705SXin Li // License. See LICENSE.TXT for details.
7*67e74705SXin Li //
8*67e74705SXin Li //===--------------------------------------------------------------===//
9*67e74705SXin Li 
10*67e74705SXin Li #include "clang/Lex/Preprocessor.h"
11*67e74705SXin Li #include "clang/AST/ASTConsumer.h"
12*67e74705SXin Li #include "clang/AST/ASTContext.h"
13*67e74705SXin Li #include "clang/Basic/Diagnostic.h"
14*67e74705SXin Li #include "clang/Basic/DiagnosticOptions.h"
15*67e74705SXin Li #include "clang/Basic/FileManager.h"
16*67e74705SXin Li #include "clang/Basic/LangOptions.h"
17*67e74705SXin Li #include "clang/Basic/SourceManager.h"
18*67e74705SXin Li #include "clang/Basic/TargetInfo.h"
19*67e74705SXin Li #include "clang/Basic/TargetOptions.h"
20*67e74705SXin Li #include "clang/Lex/HeaderSearch.h"
21*67e74705SXin Li #include "clang/Lex/HeaderSearchOptions.h"
22*67e74705SXin Li #include "clang/Lex/ModuleLoader.h"
23*67e74705SXin Li #include "clang/Lex/PreprocessorOptions.h"
24*67e74705SXin Li #include "clang/Parse/Parser.h"
25*67e74705SXin Li #include "clang/Sema/Sema.h"
26*67e74705SXin Li #include "llvm/ADT/SmallString.h"
27*67e74705SXin Li #include "llvm/Support/Path.h"
28*67e74705SXin Li #include "gtest/gtest.h"
29*67e74705SXin Li 
30*67e74705SXin Li using namespace clang;
31*67e74705SXin Li 
32*67e74705SXin Li namespace {
33*67e74705SXin Li 
34*67e74705SXin Li // Stub out module loading.
35*67e74705SXin Li class VoidModuleLoader : public ModuleLoader {
loadModule(SourceLocation ImportLoc,ModuleIdPath Path,Module::NameVisibilityKind Visibility,bool IsInclusionDirective)36*67e74705SXin Li   ModuleLoadResult loadModule(SourceLocation ImportLoc,
37*67e74705SXin Li                               ModuleIdPath Path,
38*67e74705SXin Li                               Module::NameVisibilityKind Visibility,
39*67e74705SXin Li                               bool IsInclusionDirective) override {
40*67e74705SXin Li     return ModuleLoadResult();
41*67e74705SXin Li   }
42*67e74705SXin Li 
makeModuleVisible(Module * Mod,Module::NameVisibilityKind Visibility,SourceLocation ImportLoc)43*67e74705SXin Li   void makeModuleVisible(Module *Mod,
44*67e74705SXin Li                          Module::NameVisibilityKind Visibility,
45*67e74705SXin Li                          SourceLocation ImportLoc) override { }
46*67e74705SXin Li 
loadGlobalModuleIndex(SourceLocation TriggerLoc)47*67e74705SXin Li   GlobalModuleIndex *loadGlobalModuleIndex(SourceLocation TriggerLoc) override
48*67e74705SXin Li     { return nullptr; }
lookupMissingImports(StringRef Name,SourceLocation TriggerLoc)49*67e74705SXin Li   bool lookupMissingImports(StringRef Name, SourceLocation TriggerLoc) override
50*67e74705SXin Li     { return 0; }
51*67e74705SXin Li };
52*67e74705SXin Li 
53*67e74705SXin Li // Stub to collect data from InclusionDirective callbacks.
54*67e74705SXin Li class InclusionDirectiveCallbacks : public PPCallbacks {
55*67e74705SXin Li public:
InclusionDirective(SourceLocation HashLoc,const Token & IncludeTok,StringRef FileName,bool IsAngled,CharSourceRange FilenameRange,const FileEntry * File,StringRef SearchPath,StringRef RelativePath,const Module * Imported)56*67e74705SXin Li   void InclusionDirective(SourceLocation HashLoc, const Token &IncludeTok,
57*67e74705SXin Li                           StringRef FileName, bool IsAngled,
58*67e74705SXin Li                           CharSourceRange FilenameRange, const FileEntry *File,
59*67e74705SXin Li                           StringRef SearchPath, StringRef RelativePath,
60*67e74705SXin Li                           const Module *Imported) override {
61*67e74705SXin Li       this->HashLoc = HashLoc;
62*67e74705SXin Li       this->IncludeTok = IncludeTok;
63*67e74705SXin Li       this->FileName = FileName.str();
64*67e74705SXin Li       this->IsAngled = IsAngled;
65*67e74705SXin Li       this->FilenameRange = FilenameRange;
66*67e74705SXin Li       this->File = File;
67*67e74705SXin Li       this->SearchPath = SearchPath.str();
68*67e74705SXin Li       this->RelativePath = RelativePath.str();
69*67e74705SXin Li       this->Imported = Imported;
70*67e74705SXin Li   }
71*67e74705SXin Li 
72*67e74705SXin Li   SourceLocation HashLoc;
73*67e74705SXin Li   Token IncludeTok;
74*67e74705SXin Li   SmallString<16> FileName;
75*67e74705SXin Li   bool IsAngled;
76*67e74705SXin Li   CharSourceRange FilenameRange;
77*67e74705SXin Li   const FileEntry* File;
78*67e74705SXin Li   SmallString<16> SearchPath;
79*67e74705SXin Li   SmallString<16> RelativePath;
80*67e74705SXin Li   const Module* Imported;
81*67e74705SXin Li };
82*67e74705SXin Li 
83*67e74705SXin Li // Stub to collect data from PragmaOpenCLExtension callbacks.
84*67e74705SXin Li class PragmaOpenCLExtensionCallbacks : public PPCallbacks {
85*67e74705SXin Li public:
86*67e74705SXin Li   typedef struct {
87*67e74705SXin Li     SmallString<16> Name;
88*67e74705SXin Li     unsigned State;
89*67e74705SXin Li   } CallbackParameters;
90*67e74705SXin Li 
PragmaOpenCLExtensionCallbacks()91*67e74705SXin Li   PragmaOpenCLExtensionCallbacks() : Name("Not called."), State(99) {}
92*67e74705SXin Li 
PragmaOpenCLExtension(clang::SourceLocation NameLoc,const clang::IdentifierInfo * Name,clang::SourceLocation StateLoc,unsigned State)93*67e74705SXin Li   void PragmaOpenCLExtension(clang::SourceLocation NameLoc,
94*67e74705SXin Li                              const clang::IdentifierInfo *Name,
95*67e74705SXin Li                              clang::SourceLocation StateLoc,
96*67e74705SXin Li                              unsigned State) override {
97*67e74705SXin Li       this->NameLoc = NameLoc;
98*67e74705SXin Li       this->Name = Name->getName();
99*67e74705SXin Li       this->StateLoc = StateLoc;
100*67e74705SXin Li       this->State = State;
101*67e74705SXin Li   }
102*67e74705SXin Li 
103*67e74705SXin Li   SourceLocation NameLoc;
104*67e74705SXin Li   SmallString<16> Name;
105*67e74705SXin Li   SourceLocation StateLoc;
106*67e74705SXin Li   unsigned State;
107*67e74705SXin Li };
108*67e74705SXin Li 
109*67e74705SXin Li // PPCallbacks test fixture.
110*67e74705SXin Li class PPCallbacksTest : public ::testing::Test {
111*67e74705SXin Li protected:
PPCallbacksTest()112*67e74705SXin Li   PPCallbacksTest()
113*67e74705SXin Li       : InMemoryFileSystem(new vfs::InMemoryFileSystem),
114*67e74705SXin Li         FileMgr(FileSystemOptions(), InMemoryFileSystem),
115*67e74705SXin Li         DiagID(new DiagnosticIDs()), DiagOpts(new DiagnosticOptions()),
116*67e74705SXin Li         Diags(DiagID, DiagOpts.get(), new IgnoringDiagConsumer()),
117*67e74705SXin Li         SourceMgr(Diags, FileMgr), TargetOpts(new TargetOptions()) {
118*67e74705SXin Li     TargetOpts->Triple = "x86_64-apple-darwin11.1.0";
119*67e74705SXin Li     Target = TargetInfo::CreateTargetInfo(Diags, TargetOpts);
120*67e74705SXin Li   }
121*67e74705SXin Li 
122*67e74705SXin Li   IntrusiveRefCntPtr<vfs::InMemoryFileSystem> InMemoryFileSystem;
123*67e74705SXin Li   FileManager FileMgr;
124*67e74705SXin Li   IntrusiveRefCntPtr<DiagnosticIDs> DiagID;
125*67e74705SXin Li   IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts;
126*67e74705SXin Li   DiagnosticsEngine Diags;
127*67e74705SXin Li   SourceManager SourceMgr;
128*67e74705SXin Li   LangOptions LangOpts;
129*67e74705SXin Li   std::shared_ptr<TargetOptions> TargetOpts;
130*67e74705SXin Li   IntrusiveRefCntPtr<TargetInfo> Target;
131*67e74705SXin Li 
132*67e74705SXin Li   // Register a header path as a known file and add its location
133*67e74705SXin Li   // to search path.
AddFakeHeader(HeaderSearch & HeaderInfo,const char * HeaderPath,bool IsSystemHeader)134*67e74705SXin Li   void AddFakeHeader(HeaderSearch& HeaderInfo, const char* HeaderPath,
135*67e74705SXin Li     bool IsSystemHeader) {
136*67e74705SXin Li       // Tell FileMgr about header.
137*67e74705SXin Li       InMemoryFileSystem->addFile(HeaderPath, 0,
138*67e74705SXin Li                                   llvm::MemoryBuffer::getMemBuffer("\n"));
139*67e74705SXin Li 
140*67e74705SXin Li       // Add header's parent path to search path.
141*67e74705SXin Li       StringRef SearchPath = llvm::sys::path::parent_path(HeaderPath);
142*67e74705SXin Li       const DirectoryEntry *DE = FileMgr.getDirectory(SearchPath);
143*67e74705SXin Li       DirectoryLookup DL(DE, SrcMgr::C_User, false);
144*67e74705SXin Li       HeaderInfo.AddSearchPath(DL, IsSystemHeader);
145*67e74705SXin Li   }
146*67e74705SXin Li 
147*67e74705SXin Li   // Get the raw source string of the range.
GetSourceString(CharSourceRange Range)148*67e74705SXin Li   StringRef GetSourceString(CharSourceRange Range) {
149*67e74705SXin Li     const char* B = SourceMgr.getCharacterData(Range.getBegin());
150*67e74705SXin Li     const char* E = SourceMgr.getCharacterData(Range.getEnd());
151*67e74705SXin Li 
152*67e74705SXin Li     return StringRef(B, E - B);
153*67e74705SXin Li   }
154*67e74705SXin Li 
155*67e74705SXin Li   // Run lexer over SourceText and collect FilenameRange from
156*67e74705SXin Li   // the InclusionDirective callback.
InclusionDirectiveFilenameRange(const char * SourceText,const char * HeaderPath,bool SystemHeader)157*67e74705SXin Li   CharSourceRange InclusionDirectiveFilenameRange(const char* SourceText,
158*67e74705SXin Li       const char* HeaderPath, bool SystemHeader) {
159*67e74705SXin Li     std::unique_ptr<llvm::MemoryBuffer> Buf =
160*67e74705SXin Li         llvm::MemoryBuffer::getMemBuffer(SourceText);
161*67e74705SXin Li     SourceMgr.setMainFileID(SourceMgr.createFileID(std::move(Buf)));
162*67e74705SXin Li 
163*67e74705SXin Li     VoidModuleLoader ModLoader;
164*67e74705SXin Li 
165*67e74705SXin Li     IntrusiveRefCntPtr<HeaderSearchOptions> HSOpts = new HeaderSearchOptions();
166*67e74705SXin Li     HeaderSearch HeaderInfo(HSOpts, SourceMgr, Diags, LangOpts,
167*67e74705SXin Li                             Target.get());
168*67e74705SXin Li     AddFakeHeader(HeaderInfo, HeaderPath, SystemHeader);
169*67e74705SXin Li 
170*67e74705SXin Li     IntrusiveRefCntPtr<PreprocessorOptions> PPOpts = new PreprocessorOptions();
171*67e74705SXin Li     Preprocessor PP(PPOpts, Diags, LangOpts, SourceMgr, HeaderInfo, ModLoader,
172*67e74705SXin Li                     /*IILookup =*/nullptr,
173*67e74705SXin Li                     /*OwnsHeaderSearch =*/false);
174*67e74705SXin Li     PP.Initialize(*Target);
175*67e74705SXin Li     InclusionDirectiveCallbacks* Callbacks = new InclusionDirectiveCallbacks;
176*67e74705SXin Li     PP.addPPCallbacks(std::unique_ptr<PPCallbacks>(Callbacks));
177*67e74705SXin Li 
178*67e74705SXin Li     // Lex source text.
179*67e74705SXin Li     PP.EnterMainSourceFile();
180*67e74705SXin Li 
181*67e74705SXin Li     while (true) {
182*67e74705SXin Li       Token Tok;
183*67e74705SXin Li       PP.Lex(Tok);
184*67e74705SXin Li       if (Tok.is(tok::eof))
185*67e74705SXin Li         break;
186*67e74705SXin Li     }
187*67e74705SXin Li 
188*67e74705SXin Li     // Callbacks have been executed at this point -- return filename range.
189*67e74705SXin Li     return Callbacks->FilenameRange;
190*67e74705SXin Li   }
191*67e74705SXin Li 
192*67e74705SXin Li   PragmaOpenCLExtensionCallbacks::CallbackParameters
PragmaOpenCLExtensionCall(const char * SourceText)193*67e74705SXin Li   PragmaOpenCLExtensionCall(const char* SourceText) {
194*67e74705SXin Li     LangOptions OpenCLLangOpts;
195*67e74705SXin Li     OpenCLLangOpts.OpenCL = 1;
196*67e74705SXin Li 
197*67e74705SXin Li     std::unique_ptr<llvm::MemoryBuffer> SourceBuf =
198*67e74705SXin Li         llvm::MemoryBuffer::getMemBuffer(SourceText, "test.cl");
199*67e74705SXin Li     SourceMgr.setMainFileID(SourceMgr.createFileID(std::move(SourceBuf)));
200*67e74705SXin Li 
201*67e74705SXin Li     VoidModuleLoader ModLoader;
202*67e74705SXin Li     HeaderSearch HeaderInfo(new HeaderSearchOptions, SourceMgr, Diags,
203*67e74705SXin Li                             OpenCLLangOpts, Target.get());
204*67e74705SXin Li 
205*67e74705SXin Li     Preprocessor PP(new PreprocessorOptions(), Diags, OpenCLLangOpts, SourceMgr,
206*67e74705SXin Li                     HeaderInfo, ModLoader, /*IILookup =*/nullptr,
207*67e74705SXin Li                     /*OwnsHeaderSearch =*/false);
208*67e74705SXin Li     PP.Initialize(*Target);
209*67e74705SXin Li 
210*67e74705SXin Li     // parser actually sets correct pragma handlers for preprocessor
211*67e74705SXin Li     // according to LangOptions, so we init Parser to register opencl
212*67e74705SXin Li     // pragma handlers
213*67e74705SXin Li     ASTContext Context(OpenCLLangOpts, SourceMgr,
214*67e74705SXin Li                        PP.getIdentifierTable(), PP.getSelectorTable(),
215*67e74705SXin Li                        PP.getBuiltinInfo());
216*67e74705SXin Li     Context.InitBuiltinTypes(*Target);
217*67e74705SXin Li 
218*67e74705SXin Li     ASTConsumer Consumer;
219*67e74705SXin Li     Sema S(PP, Context, Consumer);
220*67e74705SXin Li     Parser P(PP, S, false);
221*67e74705SXin Li     PragmaOpenCLExtensionCallbacks* Callbacks = new PragmaOpenCLExtensionCallbacks;
222*67e74705SXin Li     PP.addPPCallbacks(std::unique_ptr<PPCallbacks>(Callbacks));
223*67e74705SXin Li 
224*67e74705SXin Li     // Lex source text.
225*67e74705SXin Li     PP.EnterMainSourceFile();
226*67e74705SXin Li     while (true) {
227*67e74705SXin Li       Token Tok;
228*67e74705SXin Li       PP.Lex(Tok);
229*67e74705SXin Li       if (Tok.is(tok::eof))
230*67e74705SXin Li         break;
231*67e74705SXin Li     }
232*67e74705SXin Li 
233*67e74705SXin Li     PragmaOpenCLExtensionCallbacks::CallbackParameters RetVal = {
234*67e74705SXin Li       Callbacks->Name,
235*67e74705SXin Li       Callbacks->State
236*67e74705SXin Li     };
237*67e74705SXin Li     return RetVal;
238*67e74705SXin Li   }
239*67e74705SXin Li };
240*67e74705SXin Li 
TEST_F(PPCallbacksTest,QuotedFilename)241*67e74705SXin Li TEST_F(PPCallbacksTest, QuotedFilename) {
242*67e74705SXin Li   const char* Source =
243*67e74705SXin Li     "#include \"quoted.h\"\n";
244*67e74705SXin Li 
245*67e74705SXin Li   CharSourceRange Range =
246*67e74705SXin Li     InclusionDirectiveFilenameRange(Source, "/quoted.h", false);
247*67e74705SXin Li 
248*67e74705SXin Li   ASSERT_EQ("\"quoted.h\"", GetSourceString(Range));
249*67e74705SXin Li }
250*67e74705SXin Li 
TEST_F(PPCallbacksTest,AngledFilename)251*67e74705SXin Li TEST_F(PPCallbacksTest, AngledFilename) {
252*67e74705SXin Li   const char* Source =
253*67e74705SXin Li     "#include <angled.h>\n";
254*67e74705SXin Li 
255*67e74705SXin Li   CharSourceRange Range =
256*67e74705SXin Li     InclusionDirectiveFilenameRange(Source, "/angled.h", true);
257*67e74705SXin Li 
258*67e74705SXin Li   ASSERT_EQ("<angled.h>", GetSourceString(Range));
259*67e74705SXin Li }
260*67e74705SXin Li 
TEST_F(PPCallbacksTest,QuotedInMacro)261*67e74705SXin Li TEST_F(PPCallbacksTest, QuotedInMacro) {
262*67e74705SXin Li   const char* Source =
263*67e74705SXin Li     "#define MACRO_QUOTED \"quoted.h\"\n"
264*67e74705SXin Li     "#include MACRO_QUOTED\n";
265*67e74705SXin Li 
266*67e74705SXin Li   CharSourceRange Range =
267*67e74705SXin Li     InclusionDirectiveFilenameRange(Source, "/quoted.h", false);
268*67e74705SXin Li 
269*67e74705SXin Li   ASSERT_EQ("\"quoted.h\"", GetSourceString(Range));
270*67e74705SXin Li }
271*67e74705SXin Li 
TEST_F(PPCallbacksTest,AngledInMacro)272*67e74705SXin Li TEST_F(PPCallbacksTest, AngledInMacro) {
273*67e74705SXin Li   const char* Source =
274*67e74705SXin Li     "#define MACRO_ANGLED <angled.h>\n"
275*67e74705SXin Li     "#include MACRO_ANGLED\n";
276*67e74705SXin Li 
277*67e74705SXin Li   CharSourceRange Range =
278*67e74705SXin Li     InclusionDirectiveFilenameRange(Source, "/angled.h", true);
279*67e74705SXin Li 
280*67e74705SXin Li   ASSERT_EQ("<angled.h>", GetSourceString(Range));
281*67e74705SXin Li }
282*67e74705SXin Li 
TEST_F(PPCallbacksTest,StringizedMacroArgument)283*67e74705SXin Li TEST_F(PPCallbacksTest, StringizedMacroArgument) {
284*67e74705SXin Li   const char* Source =
285*67e74705SXin Li     "#define MACRO_STRINGIZED(x) #x\n"
286*67e74705SXin Li     "#include MACRO_STRINGIZED(quoted.h)\n";
287*67e74705SXin Li 
288*67e74705SXin Li   CharSourceRange Range =
289*67e74705SXin Li     InclusionDirectiveFilenameRange(Source, "/quoted.h", false);
290*67e74705SXin Li 
291*67e74705SXin Li   ASSERT_EQ("\"quoted.h\"", GetSourceString(Range));
292*67e74705SXin Li }
293*67e74705SXin Li 
TEST_F(PPCallbacksTest,ConcatenatedMacroArgument)294*67e74705SXin Li TEST_F(PPCallbacksTest, ConcatenatedMacroArgument) {
295*67e74705SXin Li   const char* Source =
296*67e74705SXin Li     "#define MACRO_ANGLED <angled.h>\n"
297*67e74705SXin Li     "#define MACRO_CONCAT(x, y) x ## _ ## y\n"
298*67e74705SXin Li     "#include MACRO_CONCAT(MACRO, ANGLED)\n";
299*67e74705SXin Li 
300*67e74705SXin Li   CharSourceRange Range =
301*67e74705SXin Li     InclusionDirectiveFilenameRange(Source, "/angled.h", false);
302*67e74705SXin Li 
303*67e74705SXin Li   ASSERT_EQ("<angled.h>", GetSourceString(Range));
304*67e74705SXin Li }
305*67e74705SXin Li 
TEST_F(PPCallbacksTest,TrigraphFilename)306*67e74705SXin Li TEST_F(PPCallbacksTest, TrigraphFilename) {
307*67e74705SXin Li   const char* Source =
308*67e74705SXin Li     "#include \"tri\?\?-graph.h\"\n";
309*67e74705SXin Li 
310*67e74705SXin Li   CharSourceRange Range =
311*67e74705SXin Li     InclusionDirectiveFilenameRange(Source, "/tri~graph.h", false);
312*67e74705SXin Li 
313*67e74705SXin Li   ASSERT_EQ("\"tri\?\?-graph.h\"", GetSourceString(Range));
314*67e74705SXin Li }
315*67e74705SXin Li 
TEST_F(PPCallbacksTest,TrigraphInMacro)316*67e74705SXin Li TEST_F(PPCallbacksTest, TrigraphInMacro) {
317*67e74705SXin Li   const char* Source =
318*67e74705SXin Li     "#define MACRO_TRIGRAPH \"tri\?\?-graph.h\"\n"
319*67e74705SXin Li     "#include MACRO_TRIGRAPH\n";
320*67e74705SXin Li 
321*67e74705SXin Li   CharSourceRange Range =
322*67e74705SXin Li     InclusionDirectiveFilenameRange(Source, "/tri~graph.h", false);
323*67e74705SXin Li 
324*67e74705SXin Li   ASSERT_EQ("\"tri\?\?-graph.h\"", GetSourceString(Range));
325*67e74705SXin Li }
326*67e74705SXin Li 
TEST_F(PPCallbacksTest,OpenCLExtensionPragmaEnabled)327*67e74705SXin Li TEST_F(PPCallbacksTest, OpenCLExtensionPragmaEnabled) {
328*67e74705SXin Li   const char* Source =
329*67e74705SXin Li     "#pragma OPENCL EXTENSION cl_khr_fp64 : enable\n";
330*67e74705SXin Li 
331*67e74705SXin Li   PragmaOpenCLExtensionCallbacks::CallbackParameters Parameters =
332*67e74705SXin Li     PragmaOpenCLExtensionCall(Source);
333*67e74705SXin Li 
334*67e74705SXin Li   ASSERT_EQ("cl_khr_fp64", Parameters.Name);
335*67e74705SXin Li   unsigned ExpectedState = 1;
336*67e74705SXin Li   ASSERT_EQ(ExpectedState, Parameters.State);
337*67e74705SXin Li }
338*67e74705SXin Li 
TEST_F(PPCallbacksTest,OpenCLExtensionPragmaDisabled)339*67e74705SXin Li TEST_F(PPCallbacksTest, OpenCLExtensionPragmaDisabled) {
340*67e74705SXin Li   const char* Source =
341*67e74705SXin Li     "#pragma OPENCL EXTENSION cl_khr_fp16 : disable\n";
342*67e74705SXin Li 
343*67e74705SXin Li   PragmaOpenCLExtensionCallbacks::CallbackParameters Parameters =
344*67e74705SXin Li     PragmaOpenCLExtensionCall(Source);
345*67e74705SXin Li 
346*67e74705SXin Li   ASSERT_EQ("cl_khr_fp16", Parameters.Name);
347*67e74705SXin Li   unsigned ExpectedState = 0;
348*67e74705SXin Li   ASSERT_EQ(ExpectedState, Parameters.State);
349*67e74705SXin Li }
350*67e74705SXin Li 
351*67e74705SXin Li } // anonoymous namespace
352