CINDEX_LINKAGE CXType clang_getUnqualifiedType(CXType CT);
/**
+ * For reference types (e.g., "const int&"), returns the type that the
+ * reference refers to (e.g "const int").
+ *
+ * Otherwise, returns the type itself.
+ *
+ * A type that has kind \c CXType_LValueReference or
+ * \c CXType_RValueReference is a reference type.
+ */
+CINDEX_LINKAGE CXType clang_getNonReferenceType(CXType CT);
+
+/**
* Return the cursor for the declaration of the given type.
*/
CINDEX_LINKAGE CXCursor clang_getTypeDeclaration(CXType T);
return MakeCXType(GetQualType(CT).getUnqualifiedType(), GetTU(CT));
}
+CXType clang_getNonReferenceType(CXType CT) {
+ return MakeCXType(GetQualType(CT).getNonReferenceType(), GetTU(CT));
+}
+
CXCursor clang_getTypeDeclaration(CXType CT) {
if (CT.kind == CXType_Invalid)
return cxcursor::MakeCXCursorInvalid(CXCursor_NoDeclFound);
});
}
+TEST_F(LibclangParseTest, clang_getNonReferenceTypeRemovesRefQualifiers) {
+ std::string Header = "header.h";
+ WriteFile(Header, "void foo1(int&);\n"
+ "void foo2(int&&);\n");
+
+ auto is_ref_qualified = [](CXType type) -> bool {
+ return (type.kind == CXType_LValueReference) ||
+ (type.kind == CXType_RValueReference);
+ };
+
+ auto from_CXString = [](CXString cx_string) -> std::string {
+ std::string string{clang_getCString(cx_string)};
+
+ clang_disposeString(cx_string);
+
+ return string;
+ };
+
+ const char *Args[] = {"-xc++"};
+ ClangTU = clang_parseTranslationUnit(Index, Header.c_str(), Args, 1, nullptr,
+ 0, TUFlags);
+
+ Traverse([&is_ref_qualified, &from_CXString](CXCursor cursor, CXCursor) {
+ if (clang_getCursorKind(cursor) == CXCursor_FunctionDecl) {
+ CXType arg_type = clang_getArgType(clang_getCursorType(cursor), 0);
+ EXPECT_TRUE(is_ref_qualified(arg_type))
+ << "Input data '" << from_CXString(clang_getCursorSpelling(cursor))
+ << "' first argument does not have a ref-qualified type.";
+
+ CXType non_reference_arg_type = clang_getNonReferenceType(arg_type);
+ EXPECT_FALSE(is_ref_qualified(non_reference_arg_type))
+ << "The type '" << from_CXString(clang_getTypeSpelling(arg_type))
+ << "' ref-qualifier was not removed after a call to "
+ "clang_getNonReferenceType.";
+ }
+
+ return CXChildVisit_Continue;
+ });
+}
+
class LibclangRewriteTest : public LibclangParseTest {
public:
CXRewriter Rew = nullptr;