Home | History | Annotate | Download | only in Modules
      1 // RUN: rm -rf %t
      2 // RUN: %clang_cc1 -fmodules -x objective-c -emit-module -fmodules-cache-path=%t -fmodule-name=macros_top %S/Inputs/module.map
      3 // RUN: %clang_cc1 -fmodules -x objective-c -emit-module -fmodules-cache-path=%t -fmodule-name=macros_left %S/Inputs/module.map
      4 // RUN: %clang_cc1 -fmodules -x objective-c -emit-module -fmodules-cache-path=%t -fmodule-name=macros_right %S/Inputs/module.map
      5 // RUN: %clang_cc1 -fmodules -x objective-c -emit-module -fmodules-cache-path=%t -fmodule-name=macros %S/Inputs/module.map
      6 // RUN: %clang_cc1 -fmodules -x objective-c -verify -fmodules-cache-path=%t -I %S/Inputs %s
      7 // RUN: not %clang_cc1 -E -fmodules -x objective-c -fmodules-cache-path=%t -I %S/Inputs %s | FileCheck -check-prefix CHECK-PREPROCESSED %s
      8 // FIXME: When we have a syntax for modules in C, use that.
      9 // These notes come from headers in modules, and are bogus.
     10 
     11 // FIXME: expected-note@Inputs/macros_left.h:11{{previous definition is here}}
     12 // FIXME: expected-note@Inputs/macros_right.h:12{{previous definition is here}}
     13 // expected-note@Inputs/macros_right.h:12{{expanding this definition of 'LEFT_RIGHT_DIFFERENT'}}
     14 // expected-note@Inputs/macros_right.h:13{{expanding this definition of 'LEFT_RIGHT_DIFFERENT2'}}
     15 // expected-note@Inputs/macros_left.h:14{{other definition of 'LEFT_RIGHT_DIFFERENT'}}
     16 
     17 @import macros;
     18 
     19 #ifndef INTEGER
     20 #  error INTEGER macro should be visible
     21 #endif
     22 
     23 #ifdef FLOAT
     24 #  error FLOAT macro should not be visible
     25 #endif
     26 
     27 #ifdef MODULE
     28 #  error MODULE macro should not be visible
     29 #endif
     30 
     31 // CHECK-PREPROCESSED: double d
     32 double d;
     33 DOUBLE *dp = &d;
     34 
     35 #__public_macro WIBBLE // expected-error{{no macro named 'WIBBLE'}}
     36 
     37 void f() {
     38   // CHECK-PREPROCESSED: int i = INTEGER;
     39   int i = INTEGER; // the value was exported, the macro was not.
     40   i += macros; // expanded from __MODULE__ within the 'macros' module.
     41 }
     42 
     43 #ifdef __MODULE__
     44 # error Not building a module!
     45 #endif
     46 
     47 #if __building_module(macros)
     48 # error Not building a module
     49 #endif
     50 
     51 // None of the modules we depend on have been imported, and therefore
     52 // their macros should not be visible.
     53 #ifdef LEFT
     54 #  error LEFT should not be visible
     55 #endif
     56 
     57 #ifdef RIGHT
     58 #  error RIGHT should not be visible
     59 #endif
     60 
     61 #ifdef TOP
     62 #  error TOP should not be visible
     63 #endif
     64 
     65 // Import left module (which also imports top)
     66 @import macros_left;
     67 
     68 #ifndef LEFT
     69 #  error LEFT should be visible
     70 #endif
     71 
     72 #ifdef RIGHT
     73 #  error RIGHT should not be visible
     74 #endif
     75 
     76 #ifndef TOP
     77 #  error TOP should be visible
     78 #endif
     79 
     80 #ifdef TOP_LEFT_UNDEF
     81 #  error TOP_LEFT_UNDEF should not be defined
     82 #endif
     83 
     84 void test1() {
     85   int i;
     86   TOP_RIGHT_REDEF *ip = &i;
     87 }
     88 
     89 #define LEFT_RIGHT_DIFFERENT2 double // FIXME: expected-warning{{'LEFT_RIGHT_DIFFERENT2' macro redefined}} \
     90                                      // expected-note{{other definition of 'LEFT_RIGHT_DIFFERENT2'}}
     91 
     92 // Import right module (which also imports top)
     93 @import macros_right;
     94 
     95 #undef LEFT_RIGHT_DIFFERENT3
     96 
     97 #ifndef LEFT
     98 #  error LEFT should be visible
     99 #endif
    100 
    101 #ifndef RIGHT
    102 #  error RIGHT should be visible
    103 #endif
    104 
    105 #ifndef TOP
    106 #  error TOP should be visible
    107 #endif
    108 
    109 void test2() {
    110   int i;
    111   float f;
    112   double d;
    113   TOP_RIGHT_REDEF *fp = &f; // ok, right's definition overrides top's definition
    114 
    115   LEFT_RIGHT_IDENTICAL *ip = &i;
    116   LEFT_RIGHT_DIFFERENT *ip2 = &i; // expected-warning{{ambiguous expansion of macro 'LEFT_RIGHT_DIFFERENT'}}
    117   LEFT_RIGHT_DIFFERENT2 *ip3 = &i; // expected-warning{{ambiguous expansion of macro 'LEFT_RIGHT_DIFFERENT2}}
    118   int LEFT_RIGHT_DIFFERENT3;
    119 }
    120 
    121 #define LEFT_RIGHT_DIFFERENT double // FIXME: expected-warning{{'LEFT_RIGHT_DIFFERENT' macro redefined}}
    122 
    123 void test3() {
    124   double d;
    125   LEFT_RIGHT_DIFFERENT *dp = &d; // okay
    126   int x = FN_ADD(1,2);
    127 }
    128 
    129 #ifndef TOP_RIGHT_UNDEF
    130 #  error TOP_RIGHT_UNDEF should still be defined
    131 #endif
    132 
    133 @import macros_bottom;
    134 
    135 TOP_DEF_RIGHT_UNDEF *TDRUf() { return TDRUp; }
    136 
    137 @import macros_right.undef;
    138 
    139 int TOP_DEF_RIGHT_UNDEF; // ok, no longer defined
    140 
    141 // FIXME: When macros_right.undef is built, macros_top is visible because
    142 // the state from building macros_right leaks through, so macros_right.undef
    143 // undefines macros_top's macro.
    144 #ifdef TOP_RIGHT_UNDEF
    145 # error TOP_RIGHT_UNDEF should not be defined
    146 #endif
    147 
    148 @import macros_other;
    149 
    150 #ifndef TOP_OTHER_UNDEF1
    151 # error TOP_OTHER_UNDEF1 should still be defined
    152 #endif
    153 
    154 #ifndef TOP_OTHER_UNDEF2
    155 # error TOP_OTHER_UNDEF2 should still be defined
    156 #endif
    157 
    158 #ifndef TOP_OTHER_REDEF1
    159 # error TOP_OTHER_REDEF1 should still be defined
    160 #endif
    161 int n1 = TOP_OTHER_REDEF1; // expected-warning{{ambiguous expansion of macro 'TOP_OTHER_REDEF1'}}
    162 // expected-note (at) macros_top.h:19 {{expanding this definition}}
    163 // expected-note (at) macros_other.h:4 {{other definition}}
    164 
    165 #ifndef TOP_OTHER_REDEF2
    166 # error TOP_OTHER_REDEF2 should still be defined
    167 #endif
    168 int n2 = TOP_OTHER_REDEF2; // ok
    169 
    170 int n3 = TOP_OTHER_DEF_RIGHT_UNDEF; // ok
    171