// RUN: %clang_cc1 -fsyntax-only -verify -Wno-objc-root-class %s
// expected-no-diagnostics

typedef const struct __attribute__((objc_bridge(NSAttributedString))) __CFAttributedString *CFAttributedStringRef;

typedef struct __attribute__((objc_bridge_mutable(NSMutableAttributedString))) __CFAttributedString *CFMutableAttributedStringRef;

@interface NSAttributedString
@end

@interface NSMutableAttributedString
@end

struct __CFAttributedString {
};

void Test1(CFAttributedStringRef attrStr, CFMutableAttributedStringRef mutable_attrStr)
{
  id x = (NSAttributedString *) attrStr;
  id x1 =(NSAttributedString *) mutable_attrStr;
  id x2 = (NSMutableAttributedString *) attrStr;
  id x3 = (NSMutableAttributedString *) mutable_attrStr;
}

void Test2(NSAttributedString *ns_attrStr, NSMutableAttributedString *ns_mutable_attr_Str) {
  CFAttributedStringRef cfsr = (CFAttributedStringRef) ns_attrStr;
  CFMutableAttributedStringRef cfsr1 = (CFMutableAttributedStringRef) ns_attrStr;
  CFAttributedStringRef cfsr2 = (CFAttributedStringRef) ns_mutable_attr_Str;
  CFMutableAttributedStringRef cfsr3 = (CFMutableAttributedStringRef) ns_mutable_attr_Str;
}

// Tests with no definition declaration for struct __NDCFAttributedString.
typedef const struct __attribute__((objc_bridge(NSAttributedString))) __NDCFAttributedString *NDCFAttributedStringRef;

typedef struct __attribute__((objc_bridge_mutable(NSMutableAttributedString))) __NDCFAttributedString *NDCFMutableAttributedStringRef;

void Test3(NDCFAttributedStringRef attrStr, NDCFMutableAttributedStringRef mutable_attrStr)
{
  id x = (NSAttributedString *) attrStr;
  id x1 =(NSAttributedString *) mutable_attrStr;
  id x2 = (NSMutableAttributedString *) attrStr;
  id x3 = (NSMutableAttributedString *) mutable_attrStr;
}

void Test4(NSAttributedString *ns_attrStr, NSMutableAttributedString *ns_mutable_attr_Str) {
  NDCFAttributedStringRef cfsr = (NDCFAttributedStringRef) ns_attrStr;
  NDCFMutableAttributedStringRef cfsr1 = (NDCFMutableAttributedStringRef) ns_attrStr;
  NDCFAttributedStringRef cfsr2 = (NDCFAttributedStringRef) ns_mutable_attr_Str;
  NDCFMutableAttributedStringRef cfsr3 = (NDCFMutableAttributedStringRef) ns_mutable_attr_Str;
}
