Opened 6 years ago

Last modified 3 months ago

#2968 new task

Avoid generating C trigraphs

Reported by: duncan Owned by: kchugalinskiy
Priority: lowest Milestone: 7.12.1
Component: Compiler Version: 6.10.1
Keywords: unregisterised Cc:
Operating System: Unknown/Multiple Architecture: Unknown/Multiple
Type of failure: None/Unknown Test Case:
Blocked By: Blocking:
Related Tickets: Differential Revisions:

Description (last modified by thomie)

main = print "??)"

If we compile the above with an unregisterised ghc then some gcc versions report:

/tmp/ghc6084_0/ghc6084_0.hc:99:30:
     warning: trigraph ??) ignored, use -trigraphs to enable

This should make us nervous.

According to the GCC manual if we were ever to use -std=c89 or any of the official C standard compliance modes (ie non-GNU) then we would get standard C (cpp) trigraph behavior.

We should therefore add a codeGen/should_run test to make sure that the above program does always print "??)" and never "]". This test only needs to be run in unregisterised mode.

It's not an immediate priority but it may trip someone up in future when porting or if we make unregisterised C code more standards compliant and start using one of the official -std= modes. It is unlikely to hit us but if it ever did it'd be a real pain to debug.

Edit: replaced -fvia-c by unregisterised (see 392b7e2a34d26b01ca65648eb5b4a078b0a64e69).

Change History (18)

comment:1 Changed 6 years ago by duncan

For info on gcc's treatment of trigraphs see http://gcc.gnu.org/onlinedocs/cpp/Initial-processing.html

comment:2 Changed 6 years ago by igloo

  • difficulty set to Unknown
  • Owner set to igloo

comment:3 follow-up: Changed 6 years ago by igloo

  • Milestone set to 6.12 branch
  • Owner igloo deleted

Good point; I've added a test cg063. It would make sense to avoid generating them too.

Based on what gcc -Wall says, "??)" is a trigraph but "?" "?)" isn't.

comment:4 in reply to: ↑ 3 Changed 6 years ago by duncan

Replying to igloo:

Based on what gcc -Wall says, "??)" is a trigraph but "?" "?)" isn't.

Yes, the GCC page above says:

The nine trigraphs and their replacements are

          Trigraph:       ??(  ??)  ??<  ??>  ??=  ??/  ??'  ??!  ??-
          Replacement:      [    ]    {    }    #    \    ^    |    ~

It's also got some hints on how to avoid them, though it also seems to indicate that they're not portable.

comment:5 Changed 6 years ago by igloo

  • Milestone changed from 6.12 branch to 6.12.1

comment:6 Changed 5 years ago by igloo

  • Milestone changed from 6.12.1 to 6.12 branch
  • Type of failure set to None/Unknown

comment:7 Changed 5 years ago by igloo

  • Milestone changed from 6.12 branch to 6.12.3

comment:8 Changed 5 years ago by igloo

  • Milestone changed from 6.12.3 to 6.14.1
  • Priority changed from normal to low

comment:9 Changed 4 years ago by kchugalinskiy

  • Owner set to kchugalinskiy

comment:10 Changed 4 years ago by igloo

  • Milestone changed from 7.0.1 to 7.0.2

comment:11 Changed 4 years ago by igloo

  • Milestone changed from 7.0.2 to 7.2.1

comment:12 Changed 3 years ago by igloo

  • Milestone changed from 7.2.1 to 7.4.1

comment:13 Changed 3 years ago by igloo

  • Milestone changed from 7.4.1 to 7.6.1
  • Priority changed from low to lowest

comment:14 Changed 3 years ago by igloo

  • Milestone changed from 7.6.1 to 7.6.2

comment:15 Changed 9 months ago by thoughtpolice

  • Milestone changed from 7.6.2 to 7.10.1

Moving to 7.10.1.

comment:16 Changed 5 months ago by thomie

  • Description modified (diff)
  • Keywords unregisterised added
  • Summary changed from add test for C trigraphs to Avoid generating C trigraphs

comment:17 Changed 3 months ago by thoughtpolice

  • Milestone changed from 7.10.1 to 7.12.1

Moving to 7.12.1 milestone; if you feel this is an error and should be addressed sooner, please move it back to the 7.10.1 milestone.

comment:18 Changed 3 months ago by thoughtpolice

Moving to 7.12.1 milestone; if you feel this is an error and should be addressed sooner, please move it back to the 7.10.1 milestone.

Note: See TracTickets for help on using tickets.